package org.gsonformat.intellij.action;
import com.intellij.openapi.application.RunResult;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.progress.Task;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.MessageType;
import com.intellij.psi.JavaPsiFacade;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElementFactory;
import com.intellij.psi.PsiFile;
import org.gsonformat.intellij.entity.ClassEntity;
import org.gsonformat.intellij.process.ClassProcessor;
import org.gsonformat.intellij.process.IProcessor;
import org.gsonformat.intellij.ui.Toast;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
/**
* Created with IntelliJ IDEA.
* User: dim
* Date: 14-7-4
* Time: 下午3:58
*/
public class DataWriter extends WriteCommandAction.Simple {
private PsiClass cls;
private PsiElementFactory factory;
private Project project;
private PsiFile file;
private ClassEntity targetClass;
private List<String> generateClassList = new ArrayList<>();
public DataWriter(PsiFile file, Project project, PsiClass cls) {
super(project, file);
factory = JavaPsiFacade.getElementFactory(project);
this.file = file;
this.project = project;
this.cls = cls;
}
public void execute(ClassEntity targetClass) {
this.targetClass = targetClass;
ProgressManager.getInstance().run(new Task.Backgroundable(project, "GsonFormat") {
@Override
public void run(@NotNull ProgressIndicator progressIndicator) {
progressIndicator.setIndeterminate(true);
long currentTimeMillis = System.currentTimeMillis();
execute();
progressIndicator.setIndeterminate(false);
progressIndicator.setFraction(1.0);
StringBuffer sb = new StringBuffer();
sb.append("GsonFormat [" + (System.currentTimeMillis() - currentTimeMillis) + " ms]\n");
// sb.append("generate class : ( "+generateClassList.size()+" )\n");
// for (String item: generateClassList) {
// sb.append(" at "+item+"\n");
// }
// sb.append(" \n");
// NotificationCenter.info(sb.toString());
Toast.make(project, MessageType.INFO, sb.toString());
}
});
}
@NotNull
@Override
@Deprecated()
public RunResult execute() {
return super.execute();
}
@Override
protected void run() {
if (targetClass == null) {
return;
}
generateClassList.clear();
new ClassProcessor(factory, cls).generate(targetClass, new IProcessor() {
@Override
public void onStarProcess(ClassEntity classEntity, PsiElementFactory factory, PsiClass cls) {
generateClassList.add(cls.getQualifiedName());
}
@Override
public void onEndProcess(ClassEntity classEntity, PsiElementFactory factory, PsiClass cls) {
}
@Override
public void onStartGenerateClass(PsiElementFactory factory, ClassEntity classEntity, PsiClass parentClass) {
}
@Override
public void onEndGenerateClass(PsiElementFactory factory, ClassEntity classEntity, PsiClass parentClass, PsiClass generateClass) {
generateClassList.add(generateClass.getQualifiedName());
}
});
}
}