Started with PHP/HTML Formatter menu => doesn't work right now
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / phpeditor / html / HTMLFormattingStrategy.java
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/html/HTMLFormattingStrategy.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/html/HTMLFormattingStrategy.java
new file mode 100644 (file)
index 0000000..3657c8e
--- /dev/null
@@ -0,0 +1,127 @@
+package net.sourceforge.phpeclipse.phpeditor.html;
+
+import net.sourceforge.phpeclipse.phpeditor.PHPSourceViewerConfiguration;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.formatter.IFormattingStrategy;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.ui.editors.text.TextEditor;
+
+/**
+ * @author chrisl
+ *
+ * To change this generated comment edit the template variable "typecomment":
+ * Window>Preferences>Java>Templates.
+ * To enable and disable the creation of type comments go to
+ * Window>Preferences>Java>Code Generation.
+ */
+public class HTMLFormattingStrategy implements IFormattingStrategy, IHTMLConstants {
+
+       ////////////////////////////////////////////////////////////////////////
+
+       private PHPSourceViewerConfiguration fConfig;
+       private ISourceViewer fViewer;
+       //
+       private TextEditor fEditor;
+       private int fTabWidth;
+
+       ////////////////////////////////////////////////////////////////////////
+
+       public HTMLFormattingStrategy(PHPSourceViewerConfiguration cf, ISourceViewer viewer) {
+               fConfig = cf;
+               fViewer = viewer;
+               //
+               fEditor = fConfig.getEditor();
+               initPreferences();
+       }
+
+       public void initPreferences() {
+               fTabWidth=fConfig.getTabWidth(fViewer);
+       }
+       
+       ////////////////////////////////////////////////////////////////////////
+
+       /**
+        * @see IFormattingStrategy#formatterStarts(String)
+        */
+       public void formatterStarts(String initialIndentation) {
+       }
+
+       /**
+        * @see IFormattingStrategy#formatterStops()
+        */
+       public void formatterStops() {
+       }
+
+       /**
+        * @see IFormattingStrategy#format(String, boolean, String, int[])
+        */
+       public String format(String content, boolean isLineStart, String indentation, int[] positions) {
+               HTMLFormatter formatter = new HTMLFormatter(fConfig, (SourceViewer) fViewer);
+               IDocument doc = fViewer.getDocument();
+               String lineDelimiter = getLineDelimiterFor(doc);
+               int indent = 0;
+               if (indentation != null) {
+                       indent = computeIndent(indentation, fTabWidth);
+               }
+               return formatter.format(content, indent, positions, lineDelimiter, fEditor.getEditorInput().getName());
+       }
+
+       public static String getLineDelimiterFor(IDocument doc) {
+               // new for: 1GF5UU0: ITPJUI:WIN2000 - "Organize Imports" in java editor inserts lines in wrong format
+               String lineDelim = null;
+               try {
+                       lineDelim = doc.getLineDelimiter(0);
+               } catch (BadLocationException e) {
+               }
+               if (lineDelim == null) {
+                       String systemDelimiter = System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$
+                       String[] lineDelims = doc.getLegalLineDelimiters();
+                       for (int i = 0; i < lineDelims.length; i++) {
+                               if (lineDelims[i].equals(systemDelimiter)) {
+                                       lineDelim = systemDelimiter;
+                                       break;
+                               }
+                       }
+                       if (lineDelim == null) {
+                               lineDelim = lineDelims.length > 0 ? lineDelims[0] : systemDelimiter;
+                       }
+               }
+               return lineDelim;
+       }
+
+       /**
+        * Returns the indent of the given string.
+        * 
+        * @param line the text line
+        * @param tabWidth the width of the '\t' character.
+        * 
+        * @see org.eclipse.jdt.internal.corext.util.Strings.computeIndent(String,int)
+        */
+       public static int computeIndent(String line, int tabWidth) {
+               int result = 0;
+               int blanks = 0;
+               int size = line.length();
+               for (int i = 0; i < size; i++) {
+                       char c = line.charAt(i);
+                       if (c == '\t') {
+                               result++;
+                               blanks = 0;
+                       } else if (Character.isSpaceChar(c)) {
+                               blanks++;
+                               if (blanks == tabWidth) {
+                                       result++;
+                                       blanks = 0;
+                               }
+                       } else {
+                               return result;
+                       }
+               }
+               return result;
+       }
+
+       ////////////////////////////////////////////////////////////////////////
+
+}