package com.wingsofts.mvphelper.biz.file.generator.impl;
import com.intellij.ide.fileTemplates.JavaTemplateUtil;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.fileEditor.OpenFileDescriptor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiDirectory;
/**
* The file generator works in Contract/Presenter Mode.
*
* @author DengChao
* @since 2017/4/10
*/
@SuppressWarnings("ConstantConditions")
public class JavaModeFileGenerator extends BaseFileGenerator {
public JavaModeFileGenerator(Project project, PsiDirectory contractDir, PsiDirectory modelDir, PsiDirectory presenterDir, String prefix) {
super(project, contractDir, modelDir, presenterDir, prefix);
}
@Override
public void start() {
generateFile(myContractDir, myPrefix + "Contract", JavaTemplateUtil.INTERNAL_INTERFACE_TEMPLATE_NAME, (javaFile, psiClass) -> {
PsiClass model = myFactory.createInterface("Model");
PsiClass view = myFactory.createInterface("View");//You have to achieve 'View' yourself.
PsiClass presenter = myFactory.createInterface("Presenter");
model.getModifierList().setModifierProperty("public", false);//Remove modifier
view.getModifierList().setModifierProperty("public", false);
presenter.getModifierList().setModifierProperty("public", false);
psiClass.add(model);
psiClass.add(view);
psiClass.add(presenter);
psiClass.getModifierList().setModifierProperty("public", true);//force 'public interface myPrefixContract'
FileEditorManager fileEditorManager = FileEditorManager.getInstance(myProject);
OpenFileDescriptor fileDescriptor = new OpenFileDescriptor(myProject, javaFile.getVirtualFile());
fileEditorManager.openTextEditor(fileDescriptor, true);//Open the Contract
generateModel();
generatePresenter();
});
}
private void generatePresenter() {
generateFile(myPresenterDir, myPrefix + "Presenter", JavaTemplateUtil.INTERNAL_CLASS_TEMPLATE_NAME, (javaFile, psiClass) -> {
PsiClass contractClass = myShortNamesCache.getClassesByName(myPrefix + "Contract", myProjectScope)[0];
PsiClass presenter = contractClass.findInnerClassByName("Presenter", false);//don't need to search base
psiClass.getImplementsList().add(myFactory.createClassReferenceElement(presenter));
psiClass.getModifierList().setModifierProperty("public", true);//force 'public interface myPrefixContract'
});
}
private void generateModel() {
generateFile(myModelDir, myPrefix + "Model", JavaTemplateUtil.INTERNAL_CLASS_TEMPLATE_NAME, (javaFile, psiClass) -> {
PsiClass contractClass = myShortNamesCache.getClassesByName(myPrefix + "Contract", myProjectScope)[0];
PsiClass model = contractClass.findInnerClassByName("Model", false);//don't need to search base
psiClass.getImplementsList().add(myFactory.createClassReferenceElement(model));
psiClass.getModifierList().setModifierProperty("public", true);//force 'public interface myPrefixContract'
});
}
}