Created handler for handling file options

This commit is contained in:
Akash Yadav
2021-09-23 13:29:18 +05:30
parent d79b0cbf75
commit 21ecac926f
3 changed files with 354 additions and 289 deletions
@@ -96,6 +96,7 @@ import java.util.Stack;
import java.util.regex.Pattern;
import me.piruin.quickaction.ActionItem;
import me.piruin.quickaction.QuickAction;
import com.itsaky.androidide.handlers.FileOptionsHandler;
public class EditorActivity extends StudioActivity implements FileTreeFragment.FileActionListener,
TabLayout.OnTabSelectedListener,
@@ -122,6 +123,7 @@ public class EditorActivity extends StudioActivity implements FileTreeFragment.F
private JLSHandler mJLSHandler;
private LanguageClientHandler mLanguageClientHandler;
private BuildServiceHandler mBuildServiceHandler;
private FileOptionsHandler mFileOptionsHandler;
private LogLanguageImpl mLogLanguageImpl;
@@ -134,12 +136,6 @@ public class EditorActivity extends StudioActivity implements FileTreeFragment.F
public final Stack<Message> pendingMessages = new Stack<>();
private final String RES_PATH_REGEX = "/.*/src/.*/res";
private final String LAYOUTRES_PATH_REGEX = "/.*/src/.*/res/layout";
private final String MENURES_PATH_REGEX = "/.*/src/.*/res/menu";
private final String DRAWABLERES_PATH_REGEX = "/.*/src/.*/res/drawable";
private final String JAVA_PATH_REGEX = "/.*/src/.*/java";
private static final String TAG_FILE_OPTIONS_FRAGMENT = "file_options_fragment";
public static final String TAG = "EditorActivity";
@@ -205,6 +201,7 @@ public class EditorActivity extends StudioActivity implements FileTreeFragment.F
mLanguageClientHandler = new LanguageClientHandler(this);
mBuildServiceHandler = new BuildServiceHandler(this);
mJLSHandler = new JLSHandler(mLanguageClientHandler, this);
mFileOptionsHandler = new FileOptionsHandler(this);
getApp().checkAndUpdateGradle();
startServices();
@@ -787,7 +784,19 @@ public class EditorActivity extends StudioActivity implements FileTreeFragment.F
mProjectInfoSheet.setProject(mIDEProject);
return mProjectInfoSheet;
}
public FileTreeFragment getFileTreeFragment() {
return mFileTreeFragment;
}
public TreeNode getLastHoldTreeNode() {
return mLastHolded;
}
public OptionsListFragment getFileOptionsFragment() {
return mFileOptionsFragment;
}
public OptionsListFragment getFileOptionsFragment(File file) {
mFileOptionsFragment = new OptionsListFragment();
mFileOptionsFragment.addOption(new SheetOption(0, R.drawable.ic_file_copy_path, R.string.copy_path, file));
@@ -797,7 +806,7 @@ public class EditorActivity extends StudioActivity implements FileTreeFragment.F
mFileOptionsFragment.addOption(new SheetOption(3, R.drawable.ic_new_file, R.string.new_file, file));
mFileOptionsFragment.addOption(new SheetOption(4, R.drawable.ic_new_folder, R.string.new_folder, file));
}
mFileOptionsFragment.setOnOptionsClickListener(o -> handleOptionClick(o));
mFileOptionsFragment.setOnOptionsClickListener(mFileOptionsHandler);
return mFileOptionsFragment;
}
@@ -1162,285 +1171,6 @@ public class EditorActivity extends StudioActivity implements FileTreeFragment.F
builder.setPositiveButton(android.R.string.ok, null);
builder.create().show();
}
private void handleOptionClick(SheetOption o) {
if(o.extra != null && o.extra instanceof File) {
final File f = (File) o.extra;
switch(o.id) {
case 0 :
ClipboardUtils.copyText("[AndroidIDE] Copied File Path", f.getAbsolutePath());
getApp().toast(R.string.copied, Toaster.Type.SUCCESS);
break;
case 1 :
renameFile(f);
break;
case 2 :
delete(f);
break;
case 3 :
createNewFile(f);
break;
case 4 :
createNewFolder(f);
break;
}
}
}
private void createNewFile(File f) {
createNewFile(f, false);
}
private void createNewFile(final File f, boolean forceUnknownType) {
if(forceUnknownType) {
createNewEmptyFile(f);
} else {
final boolean isJava = Pattern.compile(Pattern.quote(mProject.getProjectPath()) + JAVA_PATH_REGEX).matcher(f.getAbsolutePath()).find();
final boolean isRes = Pattern.compile(Pattern.quote(mProject.getProjectPath()) + RES_PATH_REGEX).matcher(f.getAbsolutePath()).find();
final boolean isLayoutRes = Pattern.compile(Pattern.quote(mProject.getProjectPath()) + LAYOUTRES_PATH_REGEX).matcher(f.getAbsolutePath()).find();
final boolean isMenuRes = Pattern.compile(Pattern.quote(mProject.getProjectPath()) + MENURES_PATH_REGEX).matcher(f.getAbsolutePath()).find();
final boolean isDrawableRes = Pattern.compile(Pattern.quote(mProject.getProjectPath()) + DRAWABLERES_PATH_REGEX).matcher(f.getAbsolutePath()).find();
if(isJava) {
createJavaClass(f);
} else if(isLayoutRes && f.getName().equals("layout")) {
createLayoutRes(f);
} else if(isMenuRes && f.getName().equals("menu")) {
createMenuRes(f);
} else if(isDrawableRes && f.getName().equals("drawable")) {
createDrawableRes(f);
} else if(isRes && f.getName().equals("res")) {
createNewResource(f);
} else {
createNewEmptyFile(f);
}
}
}
private void createJavaClass(final File f) {
final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this, R.style.AppTheme_MaterialAlertDialog);
final LayoutCreateFileJavaBinding binding = LayoutCreateFileJavaBinding.inflate(getLayoutInflater());
builder.setView(binding.getRoot());
builder.setTitle(R.string.new_java_class);
builder.setPositiveButton(R.string.text_create, (p1, p2) -> {
p1.dismiss();
final String name = binding.name.getEditText().getText().toString().trim();
final String pkgName = ProjectWriter.getPackageName(f);
if(pkgName == null || pkgName.trim().length() <= 0) {
getApp().toast(R.string.msg_get_package_failed, Toaster.Type.ERROR);
return;
} else {
final int id = binding.typeGroup.getCheckedButtonId();
if(id == binding.typeClass.getId()) {
createFile(f, name.endsWith(".java") ? name : name.concat(".java"), ProjectWriter.createJavaClass(pkgName, !name.contains(".") ? name : name.substring(0, name.lastIndexOf("."))));
} else if(id == binding.typeInterface.getId()) {
createFile(f, name.endsWith(".java") ? name : name.concat(".java"), ProjectWriter.createJavaInterface(pkgName, !name.contains(".") ? name : name.substring(0, name.lastIndexOf("."))));
} else if(id == binding.typeEnum.getId()) {
createFile(f, name.endsWith(".java") ? name : name.concat(".java"), ProjectWriter.createJavaEnum(pkgName, !name.contains(".") ? name : name.substring(0, name.lastIndexOf("."))));
} else if(id == binding.typeActivity.getId()) {
createFile(f, name.endsWith(".java") ? name : name.concat(".java"), ProjectWriter.createActivity(pkgName, !name.contains(".") ? name : name.substring(0, name.lastIndexOf("."))));
} else {
createFile(f, name, "");
}
}
});
builder.setNegativeButton(android.R.string.cancel, null);
builder.setCancelable(false);
builder.create().show();
}
private void createLayoutRes(File f) {
createNewFileWithContent(Environment.mkdirIfNotExits(f), ProjectWriter.createLayout(), ".xml");
}
private void createMenuRes(File f) {
createNewFileWithContent(Environment.mkdirIfNotExits(f), ProjectWriter.createMenu(), ".xml");
}
private void createDrawableRes(File f) {
createNewFileWithContent(Environment.mkdirIfNotExits(f), ProjectWriter.createDrawable(), ".xml");
}
private void createNewResource(File f) {
final String[] labels = {
getString(R.string.restype_drawable),
getString(R.string.restype_layout),
getString(R.string.restype_menu),
getString(R.string.restype_other)
};
final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this, R.style.AppTheme_MaterialAlertDialog);
builder.setTitle(R.string.new_xml_resource);
builder.setItems(labels, (p1, p2) -> {
final int pos = p2;
if(pos == 0) {
createDrawableRes(new File(f, "drawable"));
} else if(pos == 1) {
createLayoutRes(new File(f, "layout"));
} else if(pos == 2) {
createMenuRes(new File(f, "menu"));
} else if(pos == 3) {
createNewFile(f, true);
}
});
builder.create().show();
}
private void createNewEmptyFile(File f) {
createNewFileWithContent(f, "");
}
private void createNewFileWithContent(File f, String content) {
createNewFileWithContent(f, content, null);
}
private void createNewFileWithContent(File folder, String content, String extension) {
final LayoutDialogTextInputBinding binding = LayoutDialogTextInputBinding.inflate(getLayoutInflater());
final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this, R.style.AppTheme_MaterialAlertDialog);
binding.name.getEditText().setHint(R.string.file_name);
builder.setTitle(R.string.new_file);
builder.setMessage(getString(R.string.msg_can_contain_slashes).concat("\n\n").concat(getString(R.string.msg_newfile_dest, folder.getAbsolutePath())));
builder.setView(binding.getRoot());
builder.setCancelable(false);
builder.setPositiveButton(R.string.text_create, (p1, p2) -> {
p1.dismiss();
String name = binding.name.getEditText().getText().toString().trim();
if(extension != null && extension.trim().length() > 0) {
name = name.endsWith(extension) ? name : name.concat(extension);
}
createFile(folder, name, content);
});
builder.setNegativeButton(android.R.string.cancel, null);
builder.create().show();
}
private void createFile(File f, String name, String content) {
if(name.length() > 0 && name.length() <= 40 && !name.startsWith("/")) {
final File file = new File(f, name);
if(file.exists()) {
getApp().toast(R.string.msg_file_exists, Toaster.Type.ERROR);
} else {
if(FileIOUtils.writeFileFromString(file, content)) {
mJLSHandler.notifyFileCreated(file);
getApp().toast(R.string.msg_file_created, Toaster.Type.SUCCESS);
if(mLastHolded != null) {
TreeNode node = new TreeNode(file);
node.setViewHolder(new FileTreeViewHolder(this));
mLastHolded.addChild(node);
mFileTreeFragment.expandNode(mLastHolded);
} else {
mFileTreeFragment.listProjectFiles();
}
} else {
getApp().toast(R.string.msg_file_creation_failed, Toaster.Type.ERROR);
}
}
} else {
getApp().toast(R.string.msg_invalid_name, Toaster.Type.ERROR);
}
}
private void createNewFolder(File f) {
final LayoutDialogTextInputBinding binding = LayoutDialogTextInputBinding.inflate(getLayoutInflater());
final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this, R.style.AppTheme_MaterialAlertDialog);
binding.name.getEditText().setHint(R.string.folder_name);
builder.setTitle(R.string.new_folder);
builder.setMessage(R.string.msg_can_contain_slashes);
builder.setView(binding.getRoot());
builder.setCancelable(false);
builder.setPositiveButton(R.string.text_create, (p1, p2) -> {
p1.dismiss();
final String name = binding.name.getEditText().getText().toString().trim();
if(name.length() > 0 && name.length() <= 40 && !name.startsWith("/")) {
final File file = new File(f, name);
if(file.exists()) {
getApp().toast(R.string.msg_folder_exists, Toaster.Type.ERROR);
} else {
if(file.mkdirs()) {
getApp().toast(R.string.msg_folder_created, Toaster.Type.SUCCESS);
if(mLastHolded != null) {
TreeNode node = new TreeNode(file);
node.setViewHolder(new FileTreeViewHolder(EditorActivity.this));
mLastHolded.addChild(node);
mFileTreeFragment.expandNode(mLastHolded);
} else {
mFileTreeFragment.listProjectFiles();
}
} else {
getApp().toast(R.string.msg_folder_creation_failed, Toaster.Type.ERROR);
}
}
} else {
getApp().toast(R.string.msg_invalid_name, Toaster.Type.ERROR);
}
});
builder.setNegativeButton(android.R.string.cancel, null);
builder.create().show();
}
private void delete(final File f) {
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this, R.style.AppTheme_MaterialAlertDialog);
builder
.setNegativeButton(android.R.string.no, null)
.setPositiveButton(android.R.string.yes, (p1, p2) -> {
p1.dismiss();
final boolean deleted = FileUtils.delete(f);
getApp().toast(deleted ? R.string.deleted : R.string.delete_failed, deleted ? Toaster.Type.SUCCESS : Toaster.Type.ERROR);
if(deleted) {
mJLSHandler.notifyFileDeleted(f);
if(mLastHolded != null) {
TreeNode parent = mLastHolded.getParent();
parent.deleteChild(mLastHolded);
mFileTreeFragment.expandNode(parent);
} else {
mFileTreeFragment.listProjectFiles();
}
EditorFragment frag = mPagerAdapter.findEditorByFile(f);
if(frag != null) {
closeFile(mPagerAdapter.getFragments().indexOf(frag));
}
}
})
.setTitle(R.string.title_confirm_delete)
.setMessage(getString(R.string.msg_confirm_delete, String.format("%s [%s]", f.getName(), f.getAbsolutePath())))
.setCancelable(false)
.create().show();
}
private void renameFile(File f) {
final LayoutDialogTextInputBinding binding = LayoutDialogTextInputBinding.inflate(LayoutInflater.from(this));
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this, R.style.AppTheme_MaterialAlertDialog);
binding.name.getEditText().setHint(getString(R.string.new_name));
binding.name.getEditText().setText(f.getName());
builder.setTitle(R.string.rename_file);
builder.setMessage(R.string.msg_rename_file);
builder.setView(binding.getRoot());
builder.setNegativeButton(android.R.string.cancel, null);
builder.setPositiveButton(R.string.rename_file, (p1, p2) -> {
p1.dismiss();
String name = binding.name.getEditText().getText().toString().trim();
boolean renamed = name != null && name.length() > 0 && name.length() <= 40 && FileUtils.rename(f, name);
getApp().toast(renamed ? R.string.renamed : R.string.rename_failed, renamed ? Toaster.Type.SUCCESS : Toaster.Type.ERROR);
if(renamed) {
if(mLastHolded != null) {
TreeNode parent = mLastHolded.getParent();
parent.deleteChild(mLastHolded);
TreeNode node = new TreeNode(new File(f.getParentFile(), name));
node.setViewHolder(new FileTreeViewHolder(EditorActivity.this));
parent.addChild(node);
mFileTreeFragment.expandNode(parent);
} else {
mFileTreeFragment.listProjectFiles();
}
}
});
builder.create().show();
}
private void createQuickActions() {
ActionItem closeThis = new ActionItem(ACTIONID_CLOSE, getString(R.string.action_closeThis), R.drawable.ic_close_this);
@@ -1490,11 +1220,11 @@ public class EditorActivity extends StudioActivity implements FileTreeFragment.F
openFile(file);
}
private void closeFile(int index) {
public void closeFile(int index) {
closeFile(index, true);
}
private void closeFile(int index, boolean selectOther) {
public void closeFile(int index, boolean selectOther) {
mBinding.tabs.removeOnTabSelectedListener(this);
int pos = index;
@@ -0,0 +1,323 @@
package com.itsaky.androidide.handlers;
import android.view.LayoutInflater;
import com.blankj.utilcode.util.ClipboardUtils;
import com.blankj.utilcode.util.FileIOUtils;
import com.blankj.utilcode.util.FileUtils;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.itsaky.androidide.R;
import com.itsaky.androidide.adapters.viewholders.FileTreeViewHolder;
import com.itsaky.androidide.databinding.LayoutCreateFileJavaBinding;
import com.itsaky.androidide.databinding.LayoutDialogTextInputBinding;
import com.itsaky.androidide.fragments.EditorFragment;
import com.itsaky.androidide.fragments.sheets.OptionsListFragment;
import com.itsaky.androidide.models.SheetOption;
import com.itsaky.androidide.utils.Environment;
import com.itsaky.androidide.utils.ProjectWriter;
import com.itsaky.toaster.Toaster;
import com.unnamed.b.atv.model.TreeNode;
import java.io.File;
import java.util.regex.Pattern;
public class FileOptionsHandler extends IDEHandler implements OptionsListFragment.OnOptionsClickListener {
private final String RES_PATH_REGEX = "/.*/src/.*/res";
private final String LAYOUTRES_PATH_REGEX = "/.*/src/.*/res/layout";
private final String MENURES_PATH_REGEX = "/.*/src/.*/res/menu";
private final String DRAWABLERES_PATH_REGEX = "/.*/src/.*/res/drawable";
private final String JAVA_PATH_REGEX = "/.*/src/.*/java";
public FileOptionsHandler(Provider provider) {
super(provider);
}
@Override
public void start() {
if(activity() == null)
throwNPE();
}
@Override
public void stop() {
}
@Override
public void onOptionsClick(SheetOption option) {
if(option.extra != null && option.extra instanceof File) {
final File f = (File) option.extra;
switch(option.id) {
case 0 :
ClipboardUtils.copyText("[AndroidIDE] Copied File Path", f.getAbsolutePath());
activity().getApp().toast(R.string.copied, Toaster.Type.SUCCESS);
break;
case 1 :
renameFile(f);
break;
case 2 :
delete(f);
break;
case 3 :
createNewFile(f);
break;
case 4 :
createNewFolder(f);
break;
}
}
}
private void createNewFile(File f) {
createNewFile(f, false);
}
private void createNewFile(final File f, boolean forceUnknownType) {
if(forceUnknownType) {
createNewEmptyFile(f);
} else {
final boolean isJava = Pattern.compile(Pattern.quote(androidProject().getProjectPath()) + JAVA_PATH_REGEX).matcher(f.getAbsolutePath()).find();
final boolean isRes = Pattern.compile(Pattern.quote(androidProject().getProjectPath()) + RES_PATH_REGEX).matcher(f.getAbsolutePath()).find();
final boolean isLayoutRes = Pattern.compile(Pattern.quote(androidProject().getProjectPath()) + LAYOUTRES_PATH_REGEX).matcher(f.getAbsolutePath()).find();
final boolean isMenuRes = Pattern.compile(Pattern.quote(androidProject().getProjectPath()) + MENURES_PATH_REGEX).matcher(f.getAbsolutePath()).find();
final boolean isDrawableRes = Pattern.compile(Pattern.quote(androidProject().getProjectPath()) + DRAWABLERES_PATH_REGEX).matcher(f.getAbsolutePath()).find();
if(isJava) {
createJavaClass(f);
} else if(isLayoutRes && f.getName().equals("layout")) {
createLayoutRes(f);
} else if(isMenuRes && f.getName().equals("menu")) {
createMenuRes(f);
} else if(isDrawableRes && f.getName().equals("drawable")) {
createDrawableRes(f);
} else if(isRes && f.getName().equals("res")) {
createNewResource(f);
} else {
createNewEmptyFile(f);
}
}
}
private void createJavaClass(final File f) {
final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(activity(), R.style.AppTheme_MaterialAlertDialog);
final LayoutCreateFileJavaBinding binding = LayoutCreateFileJavaBinding.inflate(activity().getLayoutInflater());
builder.setView(binding.getRoot());
builder.setTitle(R.string.new_java_class);
builder.setPositiveButton(R.string.text_create, (p1, p2) -> {
p1.dismiss();
final String name = binding.name.getEditText().getText().toString().trim();
final String pkgName = ProjectWriter.getPackageName(f);
if(pkgName == null || pkgName.trim().length() <= 0) {
activity().getApp().toast(R.string.msg_get_package_failed, Toaster.Type.ERROR);
return;
} else {
final int id = binding.typeGroup.getCheckedButtonId();
if(id == binding.typeClass.getId()) {
createFile(f, name.endsWith(".java") ? name : name.concat(".java"), ProjectWriter.createJavaClass(pkgName, !name.contains(".") ? name : name.substring(0, name.lastIndexOf("."))));
} else if(id == binding.typeInterface.getId()) {
createFile(f, name.endsWith(".java") ? name : name.concat(".java"), ProjectWriter.createJavaInterface(pkgName, !name.contains(".") ? name : name.substring(0, name.lastIndexOf("."))));
} else if(id == binding.typeEnum.getId()) {
createFile(f, name.endsWith(".java") ? name : name.concat(".java"), ProjectWriter.createJavaEnum(pkgName, !name.contains(".") ? name : name.substring(0, name.lastIndexOf("."))));
} else if(id == binding.typeActivity.getId()) {
createFile(f, name.endsWith(".java") ? name : name.concat(".java"), ProjectWriter.createActivity(pkgName, !name.contains(".") ? name : name.substring(0, name.lastIndexOf("."))));
} else {
createFile(f, name, "");
}
}
});
builder.setNegativeButton(android.R.string.cancel, null);
builder.setCancelable(false);
builder.create().show();
}
private void createLayoutRes(File f) {
createNewFileWithContent(Environment.mkdirIfNotExits(f), ProjectWriter.createLayout(), ".xml");
}
private void createMenuRes(File f) {
createNewFileWithContent(Environment.mkdirIfNotExits(f), ProjectWriter.createMenu(), ".xml");
}
private void createDrawableRes(File f) {
createNewFileWithContent(Environment.mkdirIfNotExits(f), ProjectWriter.createDrawable(), ".xml");
}
private void createNewResource(File f) {
final String[] labels = {
activity(). getString(R.string.restype_drawable),
activity(). getString(R.string.restype_layout),
activity(). getString(R.string.restype_menu),
activity(). getString(R.string.restype_other)
};
final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(activity(), R.style.AppTheme_MaterialAlertDialog);
builder.setTitle(R.string.new_xml_resource);
builder.setItems(labels, (p1, p2) -> {
final int pos = p2;
if(pos == 0) {
createDrawableRes(new File(f, "drawable"));
} else if(pos == 1) {
createLayoutRes(new File(f, "layout"));
} else if(pos == 2) {
createMenuRes(new File(f, "menu"));
} else if(pos == 3) {
createNewFile(f, true);
}
});
builder.create().show();
}
private void createNewEmptyFile(File f) {
createNewFileWithContent(f, "");
}
private void createNewFileWithContent(File f, String content) {
createNewFileWithContent(f, content, null);
}
private void createNewFileWithContent(File folder, String content, String extension) {
final LayoutDialogTextInputBinding binding = LayoutDialogTextInputBinding.inflate(activity(). getLayoutInflater());
final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(activity(), R.style.AppTheme_MaterialAlertDialog);
binding.name.getEditText().setHint(R.string.file_name);
builder.setTitle(R.string.new_file);
builder.setMessage(activity(). getString(R.string.msg_can_contain_slashes).concat("\n\n").concat(activity(). getString(R.string.msg_newfile_dest, folder.getAbsolutePath())));
builder.setView(binding.getRoot());
builder.setCancelable(false);
builder.setPositiveButton(R.string.text_create, (p1, p2) -> {
p1.dismiss();
String name = binding.name.getEditText().getText().toString().trim();
if(extension != null && extension.trim().length() > 0) {
name = name.endsWith(extension) ? name : name.concat(extension);
}
createFile(folder, name, content);
});
builder.setNegativeButton(android.R.string.cancel, null);
builder.create().show();
}
private void createFile(File f, String name, String content) {
if(name.length() > 0 && name.length() <= 40 && !name.startsWith("/")) {
final File file = new File(f, name);
if(file.exists()) {
activity().getApp().toast(R.string.msg_file_exists, Toaster.Type.ERROR);
} else {
if(FileIOUtils.writeFileFromString(file, content)) {
jls().notifyFileCreated(file);
activity(). getApp().toast(R.string.msg_file_created, Toaster.Type.SUCCESS);
if(activity().getLastHoldTreeNode() != null) {
TreeNode node = new TreeNode(file);
node.setViewHolder(new FileTreeViewHolder(activity()));
activity().getLastHoldTreeNode().addChild(node);
activity().getFileTreeFragment().expandNode(activity().getLastHoldTreeNode());
} else {
activity().getFileTreeFragment().listProjectFiles();
}
} else {
activity(). getApp().toast(R.string.msg_file_creation_failed, Toaster.Type.ERROR);
}
}
} else {
activity(). getApp().toast(R.string.msg_invalid_name, Toaster.Type.ERROR);
}
}
private void createNewFolder(File f) {
final LayoutDialogTextInputBinding binding = LayoutDialogTextInputBinding.inflate(activity(). getLayoutInflater());
final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(activity(), R.style.AppTheme_MaterialAlertDialog);
binding.name.getEditText().setHint(R.string.folder_name);
builder.setTitle(R.string.new_folder);
builder.setMessage(R.string.msg_can_contain_slashes);
builder.setView(binding.getRoot());
builder.setCancelable(false);
builder.setPositiveButton(R.string.text_create, (p1, p2) -> {
p1.dismiss();
final String name = binding.name.getEditText().getText().toString().trim();
if(name.length() > 0 && name.length() <= 40 && !name.startsWith("/")) {
final File file = new File(f, name);
if(file.exists()) {
activity(). getApp().toast(R.string.msg_folder_exists, Toaster.Type.ERROR);
} else {
if(file.mkdirs()) {
activity(). getApp().toast(R.string.msg_folder_created, Toaster.Type.SUCCESS);
if(activity().getLastHoldTreeNode() != null) {
TreeNode node = new TreeNode(file);
node.setViewHolder(new FileTreeViewHolder(activity()));
activity().getLastHoldTreeNode().addChild(node);
activity().getFileTreeFragment().expandNode(activity().getLastHoldTreeNode());
} else {
activity().getFileTreeFragment().listProjectFiles();
}
} else {
activity().getApp().toast(R.string.msg_folder_creation_failed, Toaster.Type.ERROR);
}
}
} else {
activity(). getApp().toast(R.string.msg_invalid_name, Toaster.Type.ERROR);
}
});
builder.setNegativeButton(android.R.string.cancel, null);
builder.create().show();
}
private void delete(final File f) {
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(activity(), R.style.AppTheme_MaterialAlertDialog);
builder
.setNegativeButton(android.R.string.no, null)
.setPositiveButton(android.R.string.yes, (p1, p2) -> {
p1.dismiss();
final boolean deleted = FileUtils.delete(f);
activity(). getApp().toast(deleted ? R.string.deleted : R.string.delete_failed, deleted ? Toaster.Type.SUCCESS : Toaster.Type.ERROR);
if(deleted) {
jls().notifyFileDeleted(f);
if(activity().getLastHoldTreeNode() != null) {
TreeNode parent = activity().getLastHoldTreeNode().getParent();
parent.deleteChild(activity().getLastHoldTreeNode());
activity().getFileTreeFragment().expandNode(parent);
} else {
activity().getFileTreeFragment().listProjectFiles();
}
EditorFragment frag = activity().getPagerAdapter().findEditorByFile(f);
if(frag != null) {
activity().closeFile(activity().getPagerAdapter().getFragments().indexOf(frag));
}
}
})
.setTitle(R.string.title_confirm_delete)
.setMessage(activity().getString(R.string.msg_confirm_delete, String.format("%s [%s]", f.getName(), f.getAbsolutePath())))
.setCancelable(false)
.create().show();
}
private void renameFile(File f) {
final LayoutDialogTextInputBinding binding = LayoutDialogTextInputBinding.inflate(LayoutInflater.from(activity()));
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(activity(), R.style.AppTheme_MaterialAlertDialog);
binding.name.getEditText().setHint(activity(). getString(R.string.new_name));
binding.name.getEditText().setText(f.getName());
builder.setTitle(R.string.rename_file);
builder.setMessage(R.string.msg_rename_file);
builder.setView(binding.getRoot());
builder.setNegativeButton(android.R.string.cancel, null);
builder.setPositiveButton(R.string.rename_file, (p1, p2) -> {
p1.dismiss();
String name = binding.name.getEditText().getText().toString().trim();
boolean renamed = name != null && name.length() > 0 && name.length() <= 40 && FileUtils.rename(f, name);
activity(). getApp().toast(renamed ? R.string.renamed : R.string.rename_failed, renamed ? Toaster.Type.SUCCESS : Toaster.Type.ERROR);
if(renamed) {
if(activity().getLastHoldTreeNode() != null) {
TreeNode parent = activity().getLastHoldTreeNode().getParent();
parent.deleteChild(activity().getLastHoldTreeNode());
TreeNode node = new TreeNode(new File(f.getParentFile(), name));
node.setViewHolder(new FileTreeViewHolder(activity()));
parent.addChild(node);
activity().getFileTreeFragment().expandNode(parent);
} else {
activity().getFileTreeFragment().listProjectFiles();
}
}
});
builder.create().show();
}
}
@@ -27,6 +27,18 @@ public abstract class IDEHandler {
return provider.provideEditorActivity();
}
protected JLSHandler jls() {
return provider.provideJLSHandler();
}
protected AndroidProject androidProject() {
return provider.provideAndroidProject();
}
protected IDEProject ideProject() {
return provider.provideIDEProject();
}
public abstract void start();
public abstract void stop ();