intial version
[phpeclipse.git] / archive / net.sourceforge.phpeclipse.jtidy / src / net / sourceforge / phpdt / tidy / actions / AbstractJTidyAction.java
diff --git a/archive/net.sourceforge.phpeclipse.jtidy/src/net/sourceforge/phpdt/tidy/actions/AbstractJTidyAction.java b/archive/net.sourceforge.phpeclipse.jtidy/src/net/sourceforge/phpdt/tidy/actions/AbstractJTidyAction.java
new file mode 100644 (file)
index 0000000..b288394
--- /dev/null
@@ -0,0 +1,213 @@
+/**
+ * Created on 13.01.2003 by Jan Schulz
+ */
+package net.sourceforge.phpdt.tidy.actions;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.util.Iterator;
+
+import net.sourceforge.phpdt.tidy.JtidyPlugin;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.texteditor.ITextEditor; 
+
+/**
+ * @author jan
+ * @since 13.01.2003
+ */
+public abstract class AbstractJTidyAction {
+       private ITextEditor fTextEditor = null;
+       private IStructuredSelection fSelection = null;
+
+       /**
+        * Parses the given stream with a Tidy Instance, which belongs to this
+        * IFile. Problems will be marked on this file.
+        * @param in
+        * @param file
+        * @return InputStream
+        */
+       protected byte[] parseStreamOfFile(InputStream in, IFile file) {
+               deleteTidyMarker(file);
+               ByteArrayOutputStream out = new ByteArrayOutputStream();
+               JtidyPlugin.getTidyInstance(file).parse(file, in, out);
+               return out.toByteArray();
+
+       }
+
+       /**
+        * Deletes all JTidy Marker of this File
+        * 
+        * @param file
+        */
+       protected void deleteTidyMarker(IFile file) {
+               try {
+                       IMarker[] markers = file.findMarkers(null, false, IResource.DEPTH_ZERO);
+                       for (int i = 0; i < markers.length; i++) {
+                               IMarker marker = markers[i];
+                               if (marker.getAttribute(JtidyPlugin.MARKER_NAME) != null) {
+                                       marker.delete();
+                               }
+                       }
+               } catch (CoreException e) {
+                       //LOGGING
+               }
+       }
+
+       /**
+        * Parses the Document with Tidy.
+        */
+       protected void parseDocument(boolean writeBack) throws ParseFailedException {
+               IDocument doku = fTextEditor.getDocumentProvider().getDocument(fTextEditor.getEditorInput());
+               assertNotNull(doku);
+               String content = doku.get();
+               IFile file = (IFile) fTextEditor.getEditorInput().getAdapter(IFile.class);
+               assertNotNull(file);
+               byte[] ret = parseStreamOfFile(new ByteArrayInputStream(content.getBytes()), file);
+               if (writeBack) {
+                       if (ret.length != 0) {
+                               String cleanedContent = new String(ret);
+                               doku.set(cleanedContent);
+                       } else {
+                               displayError(
+                                       "Formatting skipped",
+                                       "This document has errors that must be fixed before using HTML Tidy to generate a tidied up version.");
+                       }
+
+               }
+       }
+
+       /**
+        * Throws a ParseFailedException, if the given obj is null
+        * 
+        * @param obj
+        * @throws ParseFailedException
+        */
+       protected void assertNotNull(Object obj) throws ParseFailedException {
+               if (obj == null) {
+                       throw new ParseFailedException("A expected 'non-null' Value was null");
+               }
+       }
+
+       /**
+        * Updates the enable state of the parent action
+        * @param action
+        */
+       protected void updateParent(IAction action) {
+               action.setEnabled(fTextEditor != null || fSelection != null);
+       }
+
+       /**
+        * Parses all Files in the given selection...
+        */
+       protected void parseSelection(boolean writeBack) {
+               Iterator iterator = null;
+               iterator = fSelection.iterator();
+               while (iterator.hasNext()) {
+                       //  obj => selected object in the view
+                       Object obj = iterator.next();
+
+                       // is it a resource
+                       if (obj instanceof IResource) {
+                               IResource resource = (IResource) obj;
+
+                               // check if it's a file resource
+                               switch (resource.getType()) {
+
+                                       case IResource.FILE :
+                                               // single file:
+                                               IFile file = (IFile) resource;
+
+                                               InputStream in;
+                                               try {
+                                                       in = file.getContents();
+                                                       byte[] ret = parseStreamOfFile(in, file);
+
+                                                       if (writeBack) {
+                                                               if (ret.length != 0) {
+                                                                       InputStream source = new ByteArrayInputStream(ret);
+                                                                       file.setContents(source, IFile.KEEP_HISTORY, null);
+
+                                                               } else {
+                                                                       displayError(
+                                                                               "Formatting skipped",
+                                                                               "This document has errors that must be fixed before using HTML Tidy to generate a tidied up version.");
+                                                               }
+                                                       }
+                                               } catch (CoreException e) {
+                                               }
+                               }
+                       }
+               }
+       }
+       /**
+        * Method error.
+        * @param string
+        * @param string1
+        */
+       private void error(String lable, String message) {
+
+               // TODO:
+       }
+
+       /**
+                * Opens an error dialog to display the given message.
+                *
+                * @param message the error message to show
+                */
+       private void displayError(final String lable, final String message) {
+               final Shell parentShell = getShell();
+               parentShell.getDisplay().syncExec(new Runnable() {
+                       public void run() {
+                               MessageDialog.openError(parentShell, lable, message);
+                       }
+               });
+       }
+       /**
+        * Method getShell.
+        * @return Shell
+        */
+       protected abstract Shell getShell();
+
+       /**
+        * Updates the Selection: if the given selection is of type
+        * IStruckturedSelection, fSection is set to this, otehrwise the field is
+        * set to null.
+        * @param sel
+        */
+       protected void updateSelection(ISelection sel) {
+               if (sel instanceof IStructuredSelection) {
+                       fSelection = (IStructuredSelection) sel;
+                       // REVISIT: further determination of types?
+               } else {
+                       fSelection = null;
+               }
+       }
+
+       /**
+        * If the given WorkbenchPart is of type ITextEditor, fTextEditor is set to
+        * this value, otherwise to null
+        * 
+        */
+       protected void updateEditor(IEditorPart part) {
+               if (part instanceof ITextEditor) {
+                       fTextEditor = (ITextEditor) part;
+               } else {
+                       fTextEditor = null;
+               }
+       }
+
+       protected IEditorPart getEditor() {
+               return fTextEditor;
+       }
+}