package com.liferay.ide.velocity.vaulttec.ui.editor.actions;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IObjectActionDelegate;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartSite;
import com.liferay.ide.velocity.editor.VelocityEditor;
import com.liferay.ide.velocity.vaulttec.ui.VelocityPlugin;
/**
* DOCUMENT ME!
*
* @author <a href="mailto:akmal.sarhan@gmail.com">Akmal Sarhan </a>
* @version $Revision: 14 $
*/
public class FormatResourceAction implements IObjectActionDelegate
{
private Object _selected = null;
/**
*
*/
public FormatResourceAction()
{
// TODO Auto-generated constructor stub
}
private String lineSep = System.getProperty("line.separator");
/**
* @param document
*/
private IDocument format(final IDocument document)
{
Formatter formatter=new Formatter();
return formatter.format(document);
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction,
* org.eclipse.ui.IWorkbenchPart)
*/
public void setActivePart(IAction action, IWorkbenchPart targetPart)
{
_part = targetPart;
}
private IWorkbenchPart _part;
/*
* (non-Javadoc)
* @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
*/
public void run(IAction action)
{
IWorkbenchPartSite site = _part.getSite();
provider = site.getSelectionProvider();
if (_selected == null)
{
MessageDialog.openInformation(new Shell(), "VelocityPlugin", "Unable to open file");
// VelocityPlugin.log("Unable to open file");
return;
}
if (_selected instanceof IStructuredSelection)
{
//
try
{
Object[] items = ((IStructuredSelection) _selected).toArray();
Set files = new HashSet(items.length, 1.0F);
try
{
for (int i = 0; i < items.length; i++)
{
if (items[i] instanceof IResource)
{
IResource resource = (IResource) items[i];
switch (resource.getType())
{
case IResource.FOLDER:
case IResource.PROJECT:
IContainer folder = (IContainer) items[i];
getChildren(folder, files);
break;
case IResource.FILE:
files.add((IFile) items[i]);
// ((IFile) items[i]).getProject()
break;
default:
/**
* @todo use logger to print warning about
* invalid type
*/
break;
}
}
}
}
catch (CoreException ex)
{
ex.printStackTrace();
}
for (Iterator iter = files.iterator(); iter.hasNext();)
{
IFile directory = (IFile) iter.next();
formatFile(directory);
}
}
catch (Exception e)
{
VelocityPlugin.log(e);
}
} else
{
MessageDialog.openInformation(new Shell(), "VelocityPlugin", "Unable to open file");
// VelocityPlugin.log("Unable to open shell");
return;
}
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction,
* org.eclipse.jface.viewers.ISelection)
*/
public void selectionChanged(IAction action, ISelection selection)
{
_selected = null;
if (selection instanceof IStructuredSelection)
{
_selected = (IStructuredSelection) selection;
}
}
private void getChildren(IContainer resource, Set files) throws CoreException
{
IResource[] children = resource.members();
for (int i = 0; i < children.length; i++)
{
IResource child = children[i];
switch (child.getType())
{
case IResource.FILE:
if (child.getName().matches(".*?(html|vm|jspx|jspf)"))
{
files.add((IFile) child);
}
break;
case IResource.FOLDER:
getChildren((IFolder) child, files);
break;
case IResource.PROJECT:
getChildren((IProject) child, files);
break;
case IResource.ROOT:
getChildren((IWorkspaceRoot) child, files);
break;
}
}
}
ISelectionProvider provider = null;
private void formatFile(IFile file)
{
if (file.getFileExtension().matches(".*?(html|vm|jspx|jspf)"))
{
ISelection s = new StructuredSelection(file);
provider.setSelection(s);
IDocument document = new Document();
BufferedWriter awriter = null;
String line = null;
StringBuffer b = new StringBuffer();
try
{
BufferedReader in = new BufferedReader(new InputStreamReader(new BufferedInputStream(new FileInputStream(file.getLocation().toFile()))));
while ((line = in.readLine()) != null)
{
b.append(line);
b.append(lineSep);
}
document.set(b.toString());
document = format(document);
if (file instanceof IResource)
{
file.setContents(new BufferedInputStream(new ByteArrayInputStream(document.get().getBytes())), IFile.FORCE | IFile.KEEP_HISTORY, null);
((IResource) file).refreshLocal(IResource.DEPTH_ZERO, null);
}
}
catch (Exception e)
{
VelocityPlugin.log(e);
}
finally
{
if (awriter != null)
{
try
{
awriter.close();
}
catch (IOException e)
{
VelocityPlugin.log(e);
}
}
}
VelocityEditor.openInEditor(file);
}
}
}