package _VisualDVM.ProjectData.Files.UI;
import Common.Visual.DragDrop.FileDrop;
import Common.Visual.Menus.GraphMenu;
import Common.Visual.Trees.StyledTree;
import _VisualDVM.Current;
import _VisualDVM.Global;
import _VisualDVM.Passes.PassCode;
import _VisualDVM.ProjectData.Files.DBProjectFile;
import _VisualDVM.Visual.Menus.ProjectFilesMenu;

import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.File;
public class FilesTree extends StyledTree {
    public FilesTree() {
        super(Global.mainModule.getProject().filesTreeRoot);
        this.addKeyListener(new KeyAdapter() {
                                @Override
                                public void keyPressed(KeyEvent e) {
                                    switch (e.getKeyCode()) {
                                        case KeyEvent.VK_DELETE:
                                            forkFD(PassCode.DeleteFile, PassCode.DeleteDirectory);
                                            break;
                                        case KeyEvent.VK_ADD: //num lock  +
                                        case KeyEvent.VK_EQUALS:    //+
                                            Global.mainModule.getPass(PassCode.IncludeFile).Do();
                                            break;
                                        case KeyEvent.VK_SUBTRACT:  //num lock -
                                        case KeyEvent.VK_MINUS: //-
                                            Global.mainModule.getPass(PassCode.ExcludeFile).Do();
                                            break;
                                        case KeyEvent.VK_F2:
                                            forkFD(PassCode.RenameFile, PassCode.RenameDirectory);
                                            break;
                                        case KeyEvent.VK_ENTER:
                                            LeftMouseAction2();
                                            break;
                                    }
                                }
                            }
        );
        new FileDrop(System.out, this, files -> {
            Global.mainModule.getPass(PassCode.ImportFiles).Do(files);
        });
        Global.mainModule.set(Current.File, null);
    }
    private static void forkFD(PassCode file_pass, PassCode folder_pass) {
        DefaultMutableTreeNode node = Global.mainModule.getProjectNode();
        if (node != null)
            Global.mainModule.getPass((node.getUserObject() instanceof DBProjectFile) ?
                    file_pass : folder_pass).Do();
    }
    @Override
    public Class getRendererClass() {
        return FilesTreeCellRenderer.class;
    }
    @Override
    protected GraphMenu createMenu() {
        return new ProjectFilesMenu(this);
    }
    @Override
    public void SelectionAction(TreePath e) {
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) e.getLastPathComponent();
        Global.mainModule.set(Current.ProjectNode, node);
        Object o = node.getUserObject();
        if (o instanceof File) {
            Global.mainModule.set(Current.SelectedDirectory, o);
            Global.mainModule.set(Current.SelectedFile, null);
            Global.mainModule.getUI().getMainWindow().getProjectWindow().ShowNoSelectedFile();
        } else if (o instanceof DBProjectFile) {
            Global.mainModule.set(Current.SelectedFile, o);
            File file = ((DBProjectFile) o).file;
            Global.mainModule.set(Current.SelectedDirectory, file.getParentFile());
            Global.mainModule.getUI().getMainWindow().getProjectWindow().ShowSelectedFile();
        }
        Global.mainModule.getUI().getMainWindow().getProjectWindow().ShowSelectedDirectory();
    }
    @Override
    public void LeftMouseAction2() {
        if (Global.mainModule.getProjectNode() != null) {
            Object o = Global.mainModule.getProjectNode().getUserObject();
            if (o instanceof DBProjectFile) {
                //очень важно. иначе по открытии файла дерево остается в фокусе.
                //и не происходит прокрутки скролла к строке!!
                Global.mainModule.getUI().getMainWindow().getProjectWindow().FocusFileTabs();
                Global.mainModule.getPass(PassCode.OpenCurrentFile).Do(o);
            }
        }
    }
    @Override
    public void LeftMouseAction1() {
        if (Global.files_multiselection && Global.mainModule.getSelectedFile() != null) {
            Global.mainModule.getSelectedFile().SwitchSelection();
            updateUI();
        }
    }
    @Override
    protected int getStartLine() {
        return 1;
    }
}
