org.domainmath.gui.MainFrame.java Source code

Java tutorial

Introduction

Here is the source code for org.domainmath.gui.MainFrame.java

Source

/*
 * Copyright (C) 2015 Vinu K.N
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package org.domainmath.gui;

import org.domainmath.gui.Util.ScriptFileView;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Desktop;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.print.PrinterException;
import java.io.*;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.prefs.Preferences;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.text.BadLocationException;
import javax.swing.text.Caret;
import javax.swing.text.Document;
import javax.swing.text.Element;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import net.iharder.dnd.FileDrop;
import net.infonode.docking.DockingWindow;
import net.infonode.docking.DockingWindowAdapter;
import net.infonode.docking.FloatingWindow;
import net.infonode.docking.OperationAbortedException;
import net.infonode.docking.RootWindow;
import net.infonode.docking.SplitWindow;
import net.infonode.docking.TabWindow;
import net.infonode.docking.View;
import net.infonode.docking.ViewSerializer;
import net.infonode.docking.WindowBar;
import net.infonode.docking.mouse.DockingWindowActionMouseButtonListener;
import net.infonode.docking.properties.RootWindowProperties;
import net.infonode.docking.theme.DockingWindowsTheme;
import net.infonode.docking.theme.ShapedGradientDockingTheme;
import net.infonode.docking.util.DockingUtil;
import net.infonode.docking.util.MixedViewHandler;
import net.infonode.docking.util.PropertiesUtil;
import net.infonode.docking.util.ViewMap;
import net.infonode.util.Direction;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.domainmath.gui.Util.DMILogger;
import org.domainmath.gui.Util.DomainMathFileFilter;
import org.domainmath.gui.about.AboutDlg;
import org.domainmath.gui.arrayeditor.ArrayEditorPanel;
import org.domainmath.gui.debugger.Breakpoint;
import org.domainmath.gui.debugger.DbstackPanel;
import org.domainmath.gui.dialog.find_replace.FindAndReplaceDialog;
import org.domainmath.gui.editor.AutoCompleteListCellRenderer;
import org.domainmath.gui.editor.OctaveM;
import org.domainmath.gui.etc.ModuleLoader;
import org.domainmath.gui.help.QuickHelpPanel;
import org.domainmath.gui.octave.OctavePanel;
import org.domainmath.gui.packages.PackageLoader;
import org.domainmath.gui.pathsview.PathsPanel;
import org.domainmath.gui.pkgview.PkgDocFrame;
import org.domainmath.gui.pkgview.PkgViewPanel;
import org.domainmath.gui.preferences.PreferencesDlg;
import org.domainmath.gui.tools.ToolsLoader;
import org.domainmath.gui.dialog.FileMiss;
import org.domainmath.gui.dialog.Msg;
import org.domainmath.gui.dialog.ShutDown;
import org.domainmath.gui.octave.ExternalEngine;
import org.domainmath.gui.workspace.WorkspacePanel;
import org.fife.ui.autocomplete.AutoCompletion;
import org.fife.ui.autocomplete.BasicCompletion;
import org.fife.ui.autocomplete.CompletionProvider;
import org.fife.ui.autocomplete.DefaultCompletionProvider;
import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
import org.fife.ui.rsyntaxtextarea.RSyntaxTextAreaEditorKit;
import org.fife.ui.rsyntaxtextarea.SyntaxConstants;
import org.fife.ui.rtextarea.Gutter;
import org.fife.ui.rtextarea.GutterIconInfo;
import org.fife.ui.rtextarea.RTextAreaEditorKit;
import org.fife.ui.rtextarea.RTextScrollPane;

/**
 * It creates DomainMath IDE 
 * @author Vinu K.N
 */
public final class MainFrame extends javax.swing.JFrame {

    /**
     * Core of DomainMath IDE.
     * @see OctavePanel
     */
    public static OctavePanel octavePanel;
    private static final long serialVersionUID = -1960567602980065979L;

    /**
     * Object of commandArea for special purpose
     * @see OctavePanel
     * @see RSyntaxTextArea
     */
    private final RSyntaxTextArea commandArea;

    /**
     * Object of PreferencesDlg.
     */
    public PreferencesDlg preferencesDlg;

    /**
     * Octave Installation path.
     * @see PreferencesDlg
     */
    public static String octavePath;

    /**
     * Startup commands like graphics_toolkit gnuplot,pkg load java,....
     * Each commands are separated  by ;
     * @see PreferencesDlg
     */
    private final String startupCmd;

    /**
     * Startup commands like --interactive --no-history,....
     * see octave --help for more info about command line options
     * @see PreferencesDlg
     */
    private final String cmdLineOptions;

    /**
     * Creates a folder called cache to store details of path,packages etc.
     */
    private final File cache;

    /**
     * Parent root.
     */
    public static String parent_root;

    /**
     * History of commands.
     * @see RSyntaxTextArea
     */
    public static RSyntaxTextArea histArea;

    /**
     * ScrollPane of histArea.
     * @see histArea
     * @see RTextScrollPane
     */
    private final RTextScrollPane histScrollPane;

    /**
     * Workspace Panel.
     */
    public static WorkspacePanel workspace;

    /**
     * Log Root.
     */
    public static String log_root;

    /**
     * Text Area in a FileTab.
     */
    public RSyntaxTextArea areaFileTab;

    /**
     * ScrollPane of areaFileTab.
     */
    public RTextScrollPane scroll1;

    CompletionProvider provider1 = createCompletionProvider();

    /**
     * Selected file to Open in a file tab.
     */
    private String selectedFileToOpen;

    /**
     * Script Editor.
     */
    public JTabbedPane fileTab = new JTabbedPane();
    public static JTabbedPane fileTab2 = new JTabbedPane();

    /**
     * Folder or Parent of last selected file in file tab.
     */
    private String currentDirFileTab;

    /**
     * Names of selected files including full path.
     */
    public static List fileNameList = Collections.synchronizedList(new ArrayList());

    /**
     * Create a folder called log.
     */
    private final File logDir;

    /**
     * Index of files in the file tabbed pane.
     */
    public static int FILE_TAB_INDEX;

    /**
     * Gutter of FileTab.
     */
    private Gutter gutterFileTab;

    /**
     * URL of image.
     */
    private URL urlDebugImageStop;

    /**
     * Maximum number of recent files list.
     */
    private static int MAX_NUM_RECENT_FILES = 10;

    /**
     * Recent menu's order.
     */
    private static int RECENT_MENU_ORDER = 2;

    /**
     * Start up or default directory.
     */
    private final String startupDir;

    /**
     * Status bar.
     */
    public static StatusPanel statusPanel;

    /**
     * Menu contain recently opened files list.
     */
    private final RecentFileMenu recentFileMenu;

    private final PathsPanel pathPanel;
    private final PkgViewPanel pkgViewPanel;

    /**
     * Views of different panels.
     */
    private View fileTabView;
    private View pathsView;
    private View pkgView;
    private View consoleView;
    private View arrayEditorView;
    private View workspaceView;
    private View filesView;
    private View historyView;
    private RootWindow rootWindow;

    private ViewMap viewMap = new ViewMap();
    private HashMap dynamicViews = new HashMap();
    private DockingWindowsTheme currentTheme = new ShapedGradientDockingTheme();
    private RootWindowProperties properties = new RootWindowProperties();
    final RootWindowProperties titleBarStyleProperties = PropertiesUtil.createTitleBarStyleRootWindowProperties();
    TabWindow toolsTabWindow = new TabWindow();
    TabWindow workspaceAndFilesTabWindow = new TabWindow();

    private final File layout_file;
    private byte[] layouts = new byte[1];
    private final boolean wantedToClearText;
    public FileTreePanel fileTreePanel;
    private final File worksDir;
    private final String dir;
    public JScrollPane consoleScrollPane;
    private final DbstackPanel dbstackPanel;
    private final View debuggerView;
    private final View quickHelpView;
    private final QuickHelpPanel quickHelpPanel;
    private final ArrayList<GutterIconInfo> debugMarksList;
    private final ArrayList<GutterIconInfo> breakPointMarksList;
    public static ArrayList<Breakpoint> breakPointList;
    private Thread thread;

    /** 
     * Creates new form MainFrame.
     * @param args
     */
    public MainFrame(String args[]) {

        // create folders called cache and log.
        cache = new File(System.getProperty("user.dir") + File.separator + "cache");
        logDir = new File(System.getProperty("user.dir") + File.separator + "log");
        worksDir = new File(System.getProperty("user.dir") + File.separator + "works");
        cache.mkdir();
        logDir.mkdir();

        if (!worksDir.exists()) {
            worksDir.mkdir();
        }

        parent_root = cache.getAbsolutePath() + File.separator;
        log_root = logDir.getAbsolutePath() + File.separator;
        preferencesDlg = new PreferencesDlg(this, true);
        layout_file = new File(System.getProperty("user.dir") + File.separator + "layout.ini");
        initComponents();
        new PackageLoader(this);
        new ToolsLoader(this);
        makeMenu();

        setIconImage(icon);
        Preferences pr2 = Preferences.userNodeForPackage(this.getClass());

        setSize(pr2.getInt("Frame_width", 800), pr2.getInt("Frame_height", 600));
        setLocationRelativeTo(null);

        FILE_TAB_INDEX = 0;

        //create octavepanel.
        octavePanel = new OctavePanel(this);
        commandArea = octavePanel.commandArea;

        octavePath = preferencesDlg.getPath();
        startupCmd = preferencesDlg.getStartupCmd();
        wantedToClearText = preferencesDlg.wantedToClearText();
        cmdLineOptions = preferencesDlg.getCmdLineOptions();

        // set up histroy widget.
        histArea = new RSyntaxTextArea();
        histArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_OCTAVE);
        histScrollPane = new RTextScrollPane(histArea);
        histScrollPane.setWheelScrollingEnabled(true);

        workspace = new WorkspacePanel(parent_root + "DomainMath_OctaveVariables.dat", this);
        dbstackPanel = new DbstackPanel(parent_root + "DomainMath_OctaveDbStack.dat", this);

        // create recent files menu.
        recentFileMenu = new RecentFileMenu("RecentFiles", MAX_NUM_RECENT_FILES) {
            @Override
            public void onSelectFile(String filePath, ActionEvent action_event) {
                onRecentFile(filePath, action_event);
            }
        };
        this.fileMenu.add(recentFileMenu, MainFrame.RECENT_MENU_ORDER);

        statusPanel = new StatusPanel();
        fileTab.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
        fileTreePanel = new FileTreePanel(this);
        quickHelpPanel = new QuickHelpPanel();
        pathPanel = new PathsPanel(parent_root + "DomainMath_OctavePaths.dat");
        pkgViewPanel = new PkgViewPanel(parent_root + "DomainMath_OctavePackages.dat", this);

        histPanel();
        this.popupTab();

        dir = pr2.get("DomainMath_StartUpDir", System.getProperty("user.dir"));

        if (dir.equals(worksDir.getAbsolutePath())) {
            startupDir = dir;
        } else {
            startupDir = worksDir.getAbsolutePath();
        }

        currentDirFileTab = null;
        fileTabView = new View("Code Editor", null, fileTab);
        pathsView = new View("Set Paths", null, pathPanel);
        pkgView = new View("Packages", null, pkgViewPanel);
        consoleScrollPane = new JScrollPane();
        consoleScrollPane.getVerticalScrollBar().setUnitIncrement(16);
        consoleScrollPane.setViewportView(octavePanel);
        consoleView = new View("Console", null, consoleScrollPane);
        arrayEditorView = new View("Array Editor", null, new ArrayEditorPanel());
        workspaceView = new View("Workspace", null, workspace);
        debuggerView = new View("Debugger", null, this.dbstackPanel);
        filesView = new View("Files", null, fileTreePanel);
        quickHelpView = new View("Quick Help", null, quickHelpPanel);
        createRootWindow();
        setDefaultLayout();

        add(rootWindow, BorderLayout.CENTER);
        add(statusPanel, BorderLayout.PAGE_END);
        dragNDrop();
        debugMarksList = new ArrayList<>();
        breakPointMarksList = new ArrayList<>();
        breakPointList = new ArrayList<>();
        fileTab2 = fileTab;
        if (args != null) {
            openStartUpFiles(args);
        }

    }

    public JMenu getPackageMenu() {
        return this.pkgMenu;
    }

    public JMenu getToolsMenu() {
        return this.toolsMenu;
    }

    public boolean isWantedToClearText() {
        return wantedToClearText;
    }

    public void initTabComponent(int i) {
        fileTab.setTabComponentAt(FILE_TAB_INDEX, new ButtonTabComponent(this));
    }

    /**
     * Returns folder or Parent of last selected file in file tab.
     * @return currentDirFileTab
     */
    public String getCurrentDirFileTab() {
        return currentDirFileTab;
    }

    private void onRecentFile(String fileName, ActionEvent action_event) {
        File file1 = new File(fileName);
        if (file1.exists()) {
            if (!MainFrame.fileNameList.contains(file1.getAbsolutePath())) {

                open(file1, MainFrame.FILE_TAB_INDEX);
                setCurrentDirFileTab(file1.getParent());

            } else {
                System.out.println(file1.getAbsolutePath() + " already open!");
            }
        } else {
            new FileMiss(this, file1.getName() + " does not exist.");
            JMenuItem item = (JMenuItem) action_event.getSource();
            recentFileMenu.remove(item);
        }
    }

    /**
     * Set folder or Parent of last selected file in file tab.
     * @param currentDir
     */
    public void setCurrentDirFileTab(String currentDir) {
        this.currentDirFileTab = currentDir;
    }

    public static void reloadWorkspace() {
        if (WorkspacePanel.automaticRefreshCheckBoxMenuItem.isSelected()) {
            MainFrame.octavePanel.evaluate("DomainMath_OctaveVariables('" + MainFrame.parent_root
                    + "DomainMath_OctaveVariables.dat',whos);");
            workspace.reload();
        }
    }

    public void dirty() {
        areaFileTab.getDocument().addDocumentListener(new DocumentListener() {

            @Override
            public void insertUpdate(DocumentEvent e) {
            }

            @Override
            public void removeUpdate(DocumentEvent e) {
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
                if (fileTab.getTabRunCount() > 0) {
                    String n = fileTab.getTitleAt(fileTab.getSelectedIndex());
                    if (!n.endsWith("*")) {
                        fileTab.setTitleAt(fileTab.getSelectedIndex(), n + "*");
                    }
                }
            }
        });
    }

    /**
     * Set TextArea with octave syntax style.
     */
    public void setUpArea() {
        areaFileTab = new RSyntaxTextArea();
        areaFileTab.setFont(this.preferencesDlg.getScriptFont());
        areaFileTab.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_OCTAVE);
        scroll1 = new RTextScrollPane(areaFileTab);
        gutterFileTab = scroll1.getGutter();
        gutterFileTab.setVisible(true);
        gutterFileTab.setBookmarkingEnabled(true);
        urlDebugImageStop = getClass().getResource("resources/stop.png");
        gutterFileTab.setBookmarkIcon(new ImageIcon(urlDebugImageStop));

        gutterFileTab.setFoldIndicatorEnabled(true);
        needOct(true);

        scroll1.setWheelScrollingEnabled(true);

        KeyStroke key = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, ActionEvent.CTRL_MASK);

        areaFileTab.getInputMap().put(key, new CtrlEnterAction());
    }

    /**
     * Save current layout.
     */
    public void saveLayout() {
        try {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream out = new ObjectOutputStream(bos);
            rootWindow.write(out, false);

            out.close();
            layouts = bos.toByteArray();
            FileOutputStream output = new FileOutputStream(this.layout_file);
            IOUtils.write(layouts, output);
        } catch (IOException e) {

        }
    }

    /**
     * Load last saved layout.
     */
    public void loadLayout() {
        if (layouts != null) {
            try {
                layouts = org.apache.commons.io.FileUtils.readFileToByteArray(this.layout_file);
                ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(layouts));
                rootWindow.read(in, true);
                in.close();
            } catch (IOException e1) {
            }
        }
    }

    /**
     * Save script as another name.
     */
    public void saveScriptAs() {
        JFileChooser fc = new JFileChooser();
        fc.setMultiSelectionEnabled(false);
        fc.setDialogTitle("Save As");

        int returnVal = fc.showSaveDialog(this);

        if (returnVal == JFileChooser.APPROVE_OPTION) {
            String oldfile = fileTab.getToolTipTextAt(fileTab.getSelectedIndex());
            save(fc.getSelectedFile(), fileTab.getSelectedIndex());
            this.removeFileNameFromList(oldfile);
            fileTab.setToolTipTextAt(fileTab.getSelectedIndex(), fc.getSelectedFile().getAbsolutePath());
            this.addFileNameToList(fc.getSelectedFile().getAbsolutePath());
        }

    }

    public void addFileNameToList(String name) {
        fileNameList.add(name);
    }

    private void clearAllBreakPoints() {
        if (fileTab.getSelectedIndex() >= 0) {
            save();

            String file_selected = fileTab.getTitleAt(fileTab.getSelectedIndex());
            if (file_selected.endsWith(".m")) {
                String ftn_name = file_selected.substring(0, file_selected.indexOf(".m"));
                octavePanel.evalWithOutput("dbclear ('" + ftn_name + "',dbstatus('" + ftn_name + "').line)");

                RTextScrollPane t = (RTextScrollPane) fileTab.getComponentAt(fileTab.getSelectedIndex());
                t.getGutter().removeAllTrackingIcons();
            } else {
                System.out.println("");
            }

        }
    }

    private void openStartUpFiles(String[] args) {
        for (int i = 0; i < args.length; i++) {
            if (!fileNameList.contains(args[i])) {
                open(new File(args[i]), i);
                this.setCurrentDirFileTab(args[i]);
            } else {
                System.out.println(args[i] + " already open!");
            }
        }

    }

    /**
     * It creates key board action,when you press Ctrl+Enter key it evaluate current line 
     * or selected lines.
     * @see AbstractAction
     */
    class CtrlEnterAction extends AbstractAction {
        private static final long serialVersionUID = -8513963670607572717L;

        @Override
        public void actionPerformed(ActionEvent e) {
            if (fileTab.getSelectedIndex() >= 0) {

                try {
                    RTextScrollPane t = (RTextScrollPane) fileTab.getComponentAt(fileTab.getSelectedIndex());
                    RSyntaxTextArea area = (RSyntaxTextArea) t.getTextArea();

                    // if user not selected text.
                    if (area.getSelectedText() == null) {
                        int line = area.getCaretLineNumber();
                        Document doc = area.getDocument();
                        Element root = doc.getDefaultRootElement();
                        int lineCount = root.getElementCount();
                        Element elem = root.getElement(line);
                        int start = elem.getStartOffset();
                        int end = line == lineCount - 1 ? elem.getEndOffset() - 1 : elem.getEndOffset();

                        String text = doc.getText(start, end - start);

                        // check current line is not comment.
                        if (!text.startsWith("#") && !text.startsWith("%")) {
                            octavePanel.evalWithOutput(text);
                        }
                    } else { //user seected text.
                        String text = area.getSelectedText();

                        // check current line is not comment.
                        if (!text.startsWith("#") && !text.startsWith("%")) {
                            octavePanel.evalWithOutput(text);
                        }
                    }

                } catch (BadLocationException ex) {
                    Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }

    }

    public void removeFileNameFromList(int index) {
        fileNameList.remove(index);
    }

    public void removeFileNameFromList(String name) {
        fileNameList.remove(name);
    }

    public void open(File file, int file_index) {
        selectedFileToOpen = file.getName();
        if (selectedFileToOpen.endsWith(".m") || selectedFileToOpen.endsWith(".dyn")
                || selectedFileToOpen.endsWith(".mod") || selectedFileToOpen.endsWith(".pl")) {
            try {
                BufferedReader r = new BufferedReader(new FileReader(file));
                try {
                    setUpArea();
                    selectedFileToOpen = file.getName();
                    if (selectedFileToOpen.endsWith(".m")) {
                        areaFileTab.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_OCTAVE);
                        needOct(true);
                    } else {
                        areaFileTab.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_NONE);
                    }
                    areaFileTab.read(r, null);
                    r.close();

                    fileTab.addTab(file.getName(), scroll1);
                    initTabComponent(FILE_TAB_INDEX);
                    fileTab.setToolTipTextAt(FILE_TAB_INDEX, file.getAbsolutePath());

                    fileTab.setSelectedIndex(FILE_TAB_INDEX);
                    this.addFileNameToList(file.getAbsolutePath());
                    FILE_TAB_INDEX++;
                    dirty();
                    openInFlotingWindow(this.fileTabView);
                } catch (IOException ex) {
                }
            } catch (FileNotFoundException ex) {
            }
        }
    }

    public void openInFlotingWindow(View view) {
        if (!view.isShowing()) {
            FloatingWindow fw = rootWindow.createFloatingWindow(new Point(50, 50), new Dimension(600, 400), view);
            fw.getTopLevelAncestor().setVisible(true);
        }
    }

    /**
     * Creates file chooser dialog box and allows the user to select files
     * and importData selected files in fileTab.
     */
    public void open() {
        JFileChooser fc = new JFileChooser();

        // set current directory.
        if (fileTab.getTabCount() > 0) {
            File f = new File(fileTab.getToolTipTextAt(fileTab.getSelectedIndex()));
            fc.setCurrentDirectory(f.getParentFile());
        } else {
            fc.setCurrentDirectory(new File(System.getProperty("user.dir") + File.separator + "works"));
        }

        FileNameExtensionFilter filter = new FileNameExtensionFilter("M-Files  (*.m)", "m");

        fc.setAcceptAllFileFilterUsed(false);

        fc.setFileFilter(filter);
        fc.setMultiSelectionEnabled(true);
        fc.setFileView(new ScriptFileView());
        File file1[];
        int returnVal = fc.showOpenDialog(this);

        if (returnVal == JFileChooser.APPROVE_OPTION) {
            file1 = fc.getSelectedFiles();

            this.setCurrentDirFileTab(fc.getCurrentDirectory().getAbsolutePath());
            for (int i = 0; i < file1.length; i++) {
                if (!fileNameList.contains(file1[i].getAbsolutePath())) {
                    open(file1[i], i);

                } else {
                    System.out.println(file1[i].getAbsolutePath() + " already open!");
                }
            }
        }
    }

    public static void requestToChangeDir(String dir) {
        octavePanel.evalWithOutput("chdir " + "'" + dir + "'");
    }

    private void save() {
        if (fileTab.getSelectedIndex() >= 0) {
            String _file = fileTab.getToolTipTextAt(fileTab.getSelectedIndex());
            String fl = fileTab.getTitleAt(fileTab.getSelectedIndex());

            if (fl.endsWith("*")) {
                File f = new File(_file);
                save(f, fileTab.getSelectedIndex());
            }
        }

    }

    private void undo() {
        if (fileTab.getSelectedIndex() >= 0) {
            RTextScrollPane t = (RTextScrollPane) fileTab.getComponentAt(fileTab.getSelectedIndex());
            RSyntaxTextArea selectedArea = (RSyntaxTextArea) t.getTextArea();
            selectedArea.undoLastAction();

        }
    }

    private void redo() {
        if (fileTab.getSelectedIndex() >= 0) {
            RTextScrollPane t = (RTextScrollPane) fileTab.getComponentAt(fileTab.getSelectedIndex());
            RSyntaxTextArea selectedArea = (RSyntaxTextArea) t.getTextArea();
            selectedArea.redoLastAction();

        }
    }

    private void cut() {
        if (fileTab.getSelectedIndex() >= 0) {
            RTextScrollPane t = (RTextScrollPane) fileTab.getComponentAt(fileTab.getSelectedIndex());
            RSyntaxTextArea selectedArea = (RSyntaxTextArea) t.getTextArea();
            selectedArea.cut();

        }
    }

    private void copy() {
        if (fileTab.getSelectedIndex() >= 0) {
            RTextScrollPane t = (RTextScrollPane) fileTab.getComponentAt(fileTab.getSelectedIndex());
            RSyntaxTextArea selectedArea = (RSyntaxTextArea) t.getTextArea();
            selectedArea.copy();

        }
    }

    private void paste() {
        if (fileTab.getSelectedIndex() >= 0) {
            RTextScrollPane t = (RTextScrollPane) fileTab.getComponentAt(fileTab.getSelectedIndex());
            RSyntaxTextArea selectedArea = (RSyntaxTextArea) t.getTextArea();
            selectedArea.paste();

        }
    }

    private void selectAll() {
        if (fileTab.getSelectedIndex() >= 0) {
            RTextScrollPane t = (RTextScrollPane) fileTab.getComponentAt(fileTab.getSelectedIndex());
            RSyntaxTextArea selectedArea = (RSyntaxTextArea) t.getTextArea();
            selectedArea.selectAll();

        }
    }

    private void histPanel() {
        JPanel p = new JPanel(new BorderLayout());
        JToolBar b = new JToolBar("");
        b.setFloatable(false);
        b.setRollover(true);
        JButton saveButton = new JButton();
        JButton runButton = new JButton();

        saveButton.setIcon(
                new javax.swing.ImageIcon(getClass().getResource("/org/domainmath/gui/icons/script_save.png")));
        runButton.setIcon(
                new javax.swing.ImageIcon(getClass().getResource("/org/domainmath/gui/icons/terminal.png")));
        b.add(saveButton);
        b.add(runButton);
        p.add(b, BorderLayout.PAGE_START);
        p.add(this.histScrollPane, BorderLayout.CENTER);

        saveButton.addActionListener((ActionEvent e) -> {
            saveHistoryAs();
        });

        runButton.addActionListener((ActionEvent e) -> {
            runHistory();
        });
        historyView = new View("History", null, p);
    }

    public String getStartupCmd() {
        return startupCmd;
    }

    public String getOctavePath() {
        return octavePath;
    }

    public String getCmdLineOptions() {
        return cmdLineOptions;
    }

    public void runHistory() {
        String path = System.getProperty("user.dir") + File.separator + "scripts" + File.separator;
        saveHistory(new File(path + "history.m"));
        ExternalEngine externalEngine = new ExternalEngine(this.octavePath + " --interactive");
        externalEngine.setTitle(octavePath);
        externalEngine.setLocationRelativeTo(this);
        externalEngine.setVisible(true);
        externalEngine.execute("run('" + path + "history.m" + "')\n");

    }

    public void browse() {
        JFileChooser fc = new JFileChooser();
        fc.setCurrentDirectory(new File(System.getProperty("user.dir") + File.separator + "works"));
        fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        fc.setMultiSelectionEnabled(false);

        File _file;
        int returnVal = fc.showOpenDialog(this);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            _file = fc.getSelectedFile();
            setDir(_file.getAbsolutePath());

        }
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        buttonGroup1 = new javax.swing.ButtonGroup();
        jToolBar1 = new javax.swing.JToolBar();
        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();
        jButton3 = new javax.swing.JButton();
        jSeparator4 = new javax.swing.JToolBar.Separator();
        connectButton = new javax.swing.JButton();
        disconnectButton = new javax.swing.JButton();
        jSeparator9 = new javax.swing.JToolBar.Separator();
        jButton4 = new javax.swing.JButton();
        jButton5 = new javax.swing.JButton();
        jSeparator15 = new javax.swing.JToolBar.Separator();
        jButton6 = new javax.swing.JButton();
        jButton7 = new javax.swing.JButton();
        jButton8 = new javax.swing.JButton();
        jSeparator13 = new javax.swing.JToolBar.Separator();
        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        dirComboBox = new javax.swing.JComboBox();
        folderUpButton = new javax.swing.JButton();
        browseButton = new javax.swing.JButton();
        addButton = new javax.swing.JButton();
        jMenuBar1 = new javax.swing.JMenuBar();
        fileMenu = new javax.swing.JMenu();
        newFileItem = new javax.swing.JMenuItem();
        openItem = new javax.swing.JMenuItem();
        jSeparator17 = new javax.swing.JPopupMenu.Separator();
        saveFileItem = new javax.swing.JMenuItem();
        saveAsItem = new javax.swing.JMenuItem();
        savePlotItem = new javax.swing.JMenuItem();
        saveAllItem = new javax.swing.JMenuItem();
        jSeparator1 = new javax.swing.JPopupMenu.Separator();
        printFileItem = new javax.swing.JMenuItem();
        printItem = new javax.swing.JMenuItem();
        jSeparator19 = new javax.swing.JPopupMenu.Separator();
        preferencesItem = new javax.swing.JMenuItem();
        jSeparator2 = new javax.swing.JPopupMenu.Separator();
        connectItem = new javax.swing.JMenuItem();
        disconnectItem = new javax.swing.JMenuItem();
        jSeparator3 = new javax.swing.JPopupMenu.Separator();
        exitItem = new javax.swing.JMenuItem();
        editMenu = new javax.swing.JMenu();
        undoItem = new javax.swing.JMenuItem();
        redoItem = new javax.swing.JMenuItem();
        jSeparator20 = new javax.swing.JPopupMenu.Separator();
        cutItem = new javax.swing.JMenuItem();
        copyItem = new javax.swing.JMenuItem();
        pasteItem = new javax.swing.JMenuItem();
        jSeparator21 = new javax.swing.JPopupMenu.Separator();
        deleteItem = new javax.swing.JMenuItem();
        selectAllItem = new javax.swing.JMenuItem();
        jSeparator22 = new javax.swing.JPopupMenu.Separator();
        jMenuItem2 = new javax.swing.JMenuItem();
        jMenuItem3 = new javax.swing.JMenuItem();
        jSeparator23 = new javax.swing.JPopupMenu.Separator();
        jMenuItem4 = new javax.swing.JMenuItem();
        jMenuItem5 = new javax.swing.JMenuItem();
        jSeparator24 = new javax.swing.JPopupMenu.Separator();
        jMenuItem6 = new javax.swing.JMenuItem();
        jMenuItem1 = new javax.swing.JMenuItem();
        jSeparator11 = new javax.swing.JPopupMenu.Separator();
        clearOutWindowItem = new javax.swing.JMenuItem();
        jMenu3 = new javax.swing.JMenu();
        consoleItem = new javax.swing.JMenuItem();
        historyItem = new javax.swing.JMenuItem();
        filesItem = new javax.swing.JMenuItem();
        workspaceItem = new javax.swing.JMenuItem();
        codeEditorItem = new javax.swing.JMenuItem();
        pathsItem = new javax.swing.JMenuItem();
        pkgsItem = new javax.swing.JMenuItem();
        arrayEditItem = new javax.swing.JMenuItem();
        jMenuItem7 = new javax.swing.JMenuItem();
        jMenu1 = new javax.swing.JMenu();
        findItem = new javax.swing.JMenuItem();
        replaceItem = new javax.swing.JMenuItem();
        gotoItem = new javax.swing.JMenuItem();
        jSeparator25 = new javax.swing.JPopupMenu.Separator();
        googleItem = new javax.swing.JMenuItem();
        wikiItem = new javax.swing.JMenuItem();
        pkgMenu = new javax.swing.JMenu();
        debugMenu = new javax.swing.JMenu();
        runScriptItem = new javax.swing.JMenuItem();
        runScriptCItem = new javax.swing.JMenuItem();
        jMenuItem8 = new javax.swing.JMenuItem();
        jSeparator8 = new javax.swing.JPopupMenu.Separator();
        debugScriptMenuItem = new javax.swing.JMenuItem();
        testScriptMenuItem = new javax.swing.JMenuItem();
        toggleBreakpointItem = new javax.swing.JMenuItem();
        removeToggleBreakpointItem = new javax.swing.JMenuItem();
        clearAllBreakpointsItem = new javax.swing.JMenuItem();
        jSeparator10 = new javax.swing.JPopupMenu.Separator();
        stepItem = new javax.swing.JMenuItem();
        stepInItem = new javax.swing.JMenuItem();
        stepOutItem = new javax.swing.JMenuItem();
        continueItem = new javax.swing.JMenuItem();
        jSeparator5 = new javax.swing.JPopupMenu.Separator();
        finishDebugItem = new javax.swing.JMenuItem();
        toolsMenu = new javax.swing.JMenu();
        fltkplotItem = new javax.swing.JMenuItem();
        octaveCmdItem = new javax.swing.JMenuItem();
        jMenu2 = new javax.swing.JMenu();
        previousWindowItem = new javax.swing.JMenuItem();
        nextWindowItem = new javax.swing.JMenuItem();
        jSeparator29 = new javax.swing.JPopupMenu.Separator();
        closeItem = new javax.swing.JMenuItem();
        closeAllItem = new javax.swing.JMenuItem();
        jSeparator18 = new javax.swing.JPopupMenu.Separator();
        windowsItem = new javax.swing.JMenuItem();
        helpMenu = new javax.swing.JMenu();
        forumItem = new javax.swing.JMenuItem();
        octaveInfoItem = new javax.swing.JMenuItem();
        jSeparator12 = new javax.swing.JPopupMenu.Separator();
        quickHelpItem = new javax.swing.JMenuItem();
        jMenuItem9 = new javax.swing.JMenuItem();
        docPkgItem = new javax.swing.JMenuItem();
        referenceMenu = new javax.swing.JMenu();
        referenceItem = new javax.swing.JMenuItem();
        jSeparator6 = new javax.swing.JPopupMenu.Separator();
        checkForUpdatesMenuItem = new javax.swing.JMenuItem();
        onlineHelpItem = new javax.swing.JMenuItem();
        faqItem = new javax.swing.JMenuItem();
        jSeparator14 = new javax.swing.JPopupMenu.Separator();
        reportBugItem = new javax.swing.JMenuItem();
        feedBackItem = new javax.swing.JMenuItem();
        jSeparator7 = new javax.swing.JPopupMenu.Separator();
        AboutItem = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
        java.util.ResourceBundle bundle = java.util.ResourceBundle
                .getBundle("org/domainmath/gui/resources/DomainMath_en"); // NOI18N
        setTitle(bundle.getString("DomainMath.title")); // NOI18N
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                formWindowClosing(evt);
            }

            public void windowOpened(java.awt.event.WindowEvent evt) {
                formWindowOpened(evt);
            }
        });

        jToolBar1.setRollover(true);
        jToolBar1.setName("Standard"); // NOI18N

        jButton1.setIcon(new javax.swing.ImageIcon(
                getClass().getResource("/org/domainmath/gui/icons/size22x22/document-new.png"))); // NOI18N
        jButton1.setFocusable(false);
        jButton1.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton1.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });
        jToolBar1.add(jButton1);

        jButton2.setIcon(new javax.swing.ImageIcon(
                getClass().getResource("/org/domainmath/gui/icons/size22x22/document-open.png"))); // NOI18N
        jButton2.setFocusable(false);
        jButton2.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton2.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });
        jToolBar1.add(jButton2);

        jButton3.setIcon(new javax.swing.ImageIcon(
                getClass().getResource("/org/domainmath/gui/icons/size22x22/document-save-all.png"))); // NOI18N
        jButton3.setFocusable(false);
        jButton3.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton3.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jButton3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton3ActionPerformed(evt);
            }
        });
        jToolBar1.add(jButton3);
        jToolBar1.add(jSeparator4);

        connectButton.setIcon(new javax.swing.ImageIcon(
                getClass().getResource("/org/domainmath/gui/icons/size22x22/connect.png"))); // NOI18N
        connectButton.setMnemonic(java.util.ResourceBundle.getBundle("org/domainmath/gui/resources/DomainMath_en")
                .getString("connectItem.mnemonic").charAt(0));
        connectButton.setToolTipText(bundle.getString("connectItem.tooltip")); // NOI18N
        connectButton.setFocusable(false);
        connectButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        connectButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        connectButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                connectButtonActionPerformed(evt);
            }
        });
        jToolBar1.add(connectButton);

        disconnectButton.setIcon(new javax.swing.ImageIcon(
                getClass().getResource("/org/domainmath/gui/icons/size22x22/disconnect.png"))); // NOI18N
        disconnectButton
                .setMnemonic(java.util.ResourceBundle.getBundle("org/domainmath/gui/resources/DomainMath_en")
                        .getString("disconnectItem.mnemonic").charAt(0));
        disconnectButton.setToolTipText(bundle.getString("disconnectItem.tooltip")); // NOI18N
        disconnectButton.setFocusable(false);
        disconnectButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        disconnectButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        disconnectButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                disconnectButtonActionPerformed(evt);
            }
        });
        jToolBar1.add(disconnectButton);
        jToolBar1.add(jSeparator9);

        jButton4.setIcon(new javax.swing.ImageIcon(
                getClass().getResource("/org/domainmath/gui/icons/size22x22/edit-undo.png"))); // NOI18N
        jButton4.setFocusable(false);
        jButton4.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton4.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jButton4.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton4ActionPerformed(evt);
            }
        });
        jToolBar1.add(jButton4);

        jButton5.setIcon(new javax.swing.ImageIcon(
                getClass().getResource("/org/domainmath/gui/icons/size22x22/edit-redo.png"))); // NOI18N
        jButton5.setFocusable(false);
        jButton5.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton5.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jButton5.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton5ActionPerformed(evt);
            }
        });
        jToolBar1.add(jButton5);
        jToolBar1.add(jSeparator15);

        jButton6.setIcon(new javax.swing.ImageIcon(
                getClass().getResource("/org/domainmath/gui/icons/size22x22/edit-cut.png"))); // NOI18N
        jButton6.setFocusable(false);
        jButton6.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton6.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jButton6.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton6ActionPerformed(evt);
            }
        });
        jToolBar1.add(jButton6);

        jButton7.setIcon(new javax.swing.ImageIcon(
                getClass().getResource("/org/domainmath/gui/icons/size22x22/edit-copy.png"))); // NOI18N
        jButton7.setFocusable(false);
        jButton7.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton7.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jButton7.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton7ActionPerformed(evt);
            }
        });
        jToolBar1.add(jButton7);

        jButton8.setIcon(new javax.swing.ImageIcon(
                getClass().getResource("/org/domainmath/gui/icons/size22x22/edit-paste.png"))); // NOI18N
        jButton8.setFocusable(false);
        jButton8.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton8.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jButton8.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton8ActionPerformed(evt);
            }
        });
        jToolBar1.add(jButton8);
        jToolBar1.add(jSeparator13);

        jLabel1.setText("Current Directory:");

        dirComboBox.setEditable(true);
        dirComboBox.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                dirComboBoxItemStateChanged(evt);
            }
        });

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout
                .setHorizontalGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(jPanel1Layout.createSequentialGroup().addGap(1, 1, 1).addComponent(jLabel1)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(dirComboBox, 0, 112, Short.MAX_VALUE).addGap(1, 1, 1)));
        jPanel1Layout.setVerticalGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jPanel1Layout.createSequentialGroup().addGap(5, 5, 5).addGroup(jPanel1Layout
                        .createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE).addComponent(jLabel1)
                        .addComponent(dirComboBox, javax.swing.GroupLayout.PREFERRED_SIZE,
                                javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(3, 3, 3)));

        jToolBar1.add(jPanel1);

        folderUpButton.setIcon(
                new javax.swing.ImageIcon(getClass().getResource("/org/domainmath/gui/icons/size22x22/go-up.png"))); // NOI18N
        folderUpButton.setToolTipText("Up");
        folderUpButton.setFocusable(false);
        folderUpButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        folderUpButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        folderUpButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                folderUpButtonActionPerformed(evt);
            }
        });
        jToolBar1.add(folderUpButton);

        browseButton.setIcon(new javax.swing.ImageIcon(
                getClass().getResource("/org/domainmath/gui/icons/size22x22/document-open.png"))); // NOI18N
        browseButton.setToolTipText(bundle.getString("browseButton.title")); // NOI18N
        browseButton.setFocusable(false);
        browseButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        browseButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        browseButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                browseButtonActionPerformed(evt);
            }
        });
        jToolBar1.add(browseButton);

        addButton.setIcon(new javax.swing.ImageIcon(
                getClass().getResource("/org/domainmath/gui/icons/size22x22/edit-add.png"))); // NOI18N
        addButton.setToolTipText(bundle.getString("addButton.title")); // NOI18N
        addButton.setFocusable(false);
        addButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        addButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        addButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                addButtonActionPerformed(evt);
            }
        });
        jToolBar1.add(addButton);

        getContentPane().add(jToolBar1, java.awt.BorderLayout.PAGE_START);

        fileMenu.setMnemonic(java.util.ResourceBundle.getBundle("org/domainmath/gui/resources/DomainMath_en")
                .getString("fileMenu.mnemonic").charAt(0));
        fileMenu.setText(bundle.getString("fileMenu.name")); // NOI18N

        newFileItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_N,
                java.awt.event.InputEvent.CTRL_MASK));
        newFileItem.setIcon(
                new javax.swing.ImageIcon(getClass().getResource("/org/domainmath/gui/icons/document-new.png"))); // NOI18N
        newFileItem.setText("New");
        newFileItem.setToolTipText(bundle.getString("newMenuItem.tooltip")); // NOI18N
        newFileItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                newFileItemActionPerformed(evt);
            }
        });
        fileMenu.add(newFileItem);

        openItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_O,
                java.awt.event.InputEvent.CTRL_MASK));
        openItem.setIcon(
                new javax.swing.ImageIcon(getClass().getResource("/org/domainmath/gui/icons/document-open.png"))); // NOI18N
        openItem.setText("Open...");
        openItem.setToolTipText("Open File");
        openItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                openItemActionPerformed(evt);
            }
        });
        fileMenu.add(openItem);
        fileMenu.add(jSeparator17);

        saveFileItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S,
                java.awt.event.InputEvent.CTRL_MASK));
        saveFileItem.setIcon(
                new javax.swing.ImageIcon(getClass().getResource("/org/domainmath/gui/icons/document-save.png"))); // NOI18N
        saveFileItem.setText("Save ");
        saveFileItem.setToolTipText(bundle.getString("saveMenuItem.tooltp")); // NOI18N
        saveFileItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                saveFileItemActionPerformed(evt);
            }
        });
        fileMenu.add(saveFileItem);

        saveAsItem.setText("Save As...");
        saveAsItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                saveAsItemActionPerformed(evt);
            }
        });
        fileMenu.add(saveAsItem);

        savePlotItem.setMnemonic(java.util.ResourceBundle.getBundle("org/domainmath/gui/resources/DomainMath_en")
                .getString("savePlotItem.mnemonic").charAt(0));
        savePlotItem.setText(bundle.getString("savePlotItem.name")); // NOI18N
        savePlotItem.setToolTipText(bundle.getString("savePlotItem.tooltip")); // NOI18N
        savePlotItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                savePlotItemActionPerformed(evt);
            }
        });
        fileMenu.add(savePlotItem);

        saveAllItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S,
                java.awt.event.InputEvent.SHIFT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        saveAllItem.setIcon(new javax.swing.ImageIcon(
                getClass().getResource("/org/domainmath/gui/icons/document-save-all.png"))); // NOI18N
        saveAllItem.setText(bundle.getString("saveAllMenuItem.text")); // NOI18N
        saveAllItem.setToolTipText(bundle.getString("saveAllMenuItem.tooltip")); // NOI18N
        saveAllItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                saveAllItemActionPerformed(evt);
            }
        });
        fileMenu.add(saveAllItem);
        fileMenu.add(jSeparator1);

        printFileItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_P,
                java.awt.event.InputEvent.CTRL_MASK));
        printFileItem.setIcon(
                new javax.swing.ImageIcon(getClass().getResource("/org/domainmath/gui/icons/document-print2.png"))); // NOI18N
        printFileItem.setText("Print");
        printFileItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                printFileItemActionPerformed(evt);
            }
        });
        fileMenu.add(printFileItem);

        printItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_P,
                java.awt.event.InputEvent.SHIFT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        printItem.setMnemonic(java.util.ResourceBundle.getBundle("org/domainmath/gui/resources/DomainMath_en")
                .getString("printItem.mnemonic").charAt(0));
        printItem.setText(bundle.getString("printItem.name")); // NOI18N
        printItem.setToolTipText(bundle.getString("printItem.tooltip")); // NOI18N
        printItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                printItemActionPerformed(evt);
            }
        });
        fileMenu.add(printItem);
        fileMenu.add(jSeparator19);

        preferencesItem.setIcon(
                new javax.swing.ImageIcon(getClass().getResource("/org/domainmath/gui/icons/preferences.png"))); // NOI18N
        preferencesItem.setMnemonic(java.util.ResourceBundle.getBundle("org/domainmath/gui/resources/DomainMath_en")
                .getString("preferecesItem.mnemonic").charAt(0));
        preferencesItem.setText(bundle.getString("preferencesItem.name")); // NOI18N
        preferencesItem.setToolTipText(bundle.getString("preferencesItem.tooltip")); // NOI18N
        preferencesItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                preferencesItemActionPerformed(evt);
            }
        });
        fileMenu.add(preferencesItem);
        fileMenu.add(jSeparator2);

        connectItem.setIcon(
                new javax.swing.ImageIcon(getClass().getResource("/org/domainmath/gui/icons/connect.png"))); // NOI18N
        connectItem.setMnemonic(java.util.ResourceBundle.getBundle("org/domainmath/gui/resources/DomainMath_en")
                .getString("connectItem.mnemonic").charAt(0));
        connectItem.setText(bundle.getString("connectItem.name")); // NOI18N
        connectItem.setToolTipText(bundle.getString("connectItem.tooltip")); // NOI18N
        connectItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                connectItemActionPerformed(evt);
            }
        });
        fileMenu.add(connectItem);

        disconnectItem.setIcon(
                new javax.swing.ImageIcon(getClass().getResource("/org/domainmath/gui/icons/disconnect.png"))); // NOI18N
        disconnectItem.setMnemonic(java.util.ResourceBundle.getBundle("org/domainmath/gui/resources/DomainMath_en")
                .getString("disconnectItem.mnemonic").charAt(0));
        disconnectItem.setText(bundle.getString("disconnectItem.name")); // NOI18N
        disconnectItem.setToolTipText(bundle.getString("disconnectItem.tooltip")); // NOI18N
        disconnectItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                disconnectItemActionPerformed(evt);
            }
        });
        fileMenu.add(disconnectItem);
        fileMenu.add(jSeparator3);

        exitItem.setMnemonic(java.util.ResourceBundle.getBundle("org/domainmath/gui/resources/DomainMath_en")
                .getString("exitItem.mnemonic").charAt(0));
        exitItem.setText(bundle.getString("exitItem.name")); // NOI18N
        exitItem.setToolTipText(bundle.getString("exitItem.tooltip")); // NOI18N
        exitItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                exitItemActionPerformed(evt);
            }
        });
        fileMenu.add(exitItem);

        jMenuBar1.add(fileMenu);

        editMenu.setMnemonic(java.util.ResourceBundle.getBundle("org/domainmath/gui/resources/DomainMath_en")
                .getString("editMenu.mnemonic").charAt(0));
        editMenu.setText("Edit");

        undoItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_Z,
                java.awt.event.InputEvent.CTRL_MASK));
        undoItem.setIcon(
                new javax.swing.ImageIcon(getClass().getResource("/org/domainmath/gui/icons/edit-undo.png"))); // NOI18N
        undoItem.setText("Undo");
        undoItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                undoItemActionPerformed(evt);
            }
        });
        editMenu.add(undoItem);

        redoItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_Y,
                java.awt.event.InputEvent.CTRL_MASK));
        redoItem.setIcon(
                new javax.swing.ImageIcon(getClass().getResource("/org/domainmath/gui/icons/edit-redo.png"))); // NOI18N
        redoItem.setText("Redo");
        redoItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                redoItemActionPerformed(evt);
            }
        });
        editMenu.add(redoItem);
        editMenu.add(jSeparator20);

        cutItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_X,
                java.awt.event.InputEvent.CTRL_MASK));
        cutItem.setIcon(
                new javax.swing.ImageIcon(getClass().getResource("/org/domainmath/gui/icons/edit-cut.png"))); // NOI18N
        cutItem.setText("Cut");
        cutItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cutItemActionPerformed(evt);
            }
        });
        editMenu.add(cutItem);

        copyItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_C,
                java.awt.event.InputEvent.CTRL_MASK));
        copyItem.setIcon(
                new javax.swing.ImageIcon(getClass().getResource("/org/domainmath/gui/icons/edit-copy.png"))); // NOI18N
        copyItem.setText("Copy");
        copyItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                copyItemActionPerformed(evt);
            }
        });
        editMenu.add(copyItem);

        pasteItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_V,
                java.awt.event.InputEvent.CTRL_MASK));
        pasteItem.setIcon(
                new javax.swing.ImageIcon(getClass().getResource("/org/domainmath/gui/icons/edit-paste.png"))); // NOI18N
        pasteItem.setText("Paste");
        pasteItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                pasteItemActionPerformed(evt);
            }
        });
        editMenu.add(pasteItem);
        editMenu.add(jSeparator21);

        deleteItem.setIcon(
                new javax.swing.ImageIcon(getClass().getResource("/org/domainmath/gui/icons/edit-delete.png"))); // NOI18N
        deleteItem.setText("Delete");
        deleteItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                deleteItemActionPerformed(evt);
            }
        });
        editMenu.add(deleteItem);

        selectAllItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_A,
                java.awt.event.InputEvent.CTRL_MASK));
        selectAllItem.setIcon(
                new javax.swing.ImageIcon(getClass().getResource("/org/domainmath/gui/icons/edit-select-all.png"))); // NOI18N
        selectAllItem.setText("Select All");
        selectAllItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                selectAllItemActionPerformed(evt);
            }
        });
        editMenu.add(selectAllItem);
        editMenu.add(jSeparator22);

        jMenuItem2.setAction(new RSyntaxTextAreaEditorKit.InsertTabAction());
        jMenuItem2.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_TAB,
                java.awt.event.InputEvent.CTRL_MASK));
        jMenuItem2.setText("Increase Indent");
        editMenu.add(jMenuItem2);

        jMenuItem3.setAction(new RSyntaxTextAreaEditorKit.DecreaseIndentAction());
        jMenuItem3.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_TAB,
                java.awt.event.InputEvent.SHIFT_MASK));
        jMenuItem3.setText("Decrease Indent");
        editMenu.add(jMenuItem3);
        editMenu.add(jSeparator23);

        jMenuItem4.setAction(new RTextAreaEditorKit.UpperSelectionCaseAction());
        jMenuItem4.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_U,
                java.awt.event.InputEvent.CTRL_MASK));
        jMenuItem4.setText("Make Uppercase");
        editMenu.add(jMenuItem4);

        jMenuItem5.setAction(new RTextAreaEditorKit.LowerSelectionCaseAction());
        jMenuItem5.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_U,
                java.awt.event.InputEvent.SHIFT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        jMenuItem5.setText("Make Lowercase");
        editMenu.add(jMenuItem5);
        editMenu.add(jSeparator24);

        jMenuItem6.setText("Clear All Marks...");
        jMenuItem6.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem6ActionPerformed(evt);
            }
        });
        editMenu.add(jMenuItem6);

        jMenuItem1.setAction(new RSyntaxTextAreaEditorKit.ToggleCommentAction());
        jMenuItem1.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_SLASH,
                java.awt.event.InputEvent.CTRL_MASK));
        jMenuItem1.setText("Toggle Comment");
        jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem1ActionPerformed(evt);
            }
        });
        editMenu.add(jMenuItem1);
        editMenu.add(jSeparator11);

        clearOutWindowItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_W,
                java.awt.event.InputEvent.CTRL_MASK));
        clearOutWindowItem
                .setMnemonic(java.util.ResourceBundle.getBundle("org/domainmath/gui/resources/DomainMath_en")
                        .getString("clearOutputWindowItem.mnemonic").charAt(0));
        clearOutWindowItem.setText(bundle.getString("clearOutputWindowItem.name")); // NOI18N
        clearOutWindowItem.setToolTipText(bundle.getString("clearOutputWindowItem.tooltip")); // NOI18N
        clearOutWindowItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                clearOutWindowItemActionPerformed(evt);
            }
        });
        editMenu.add(clearOutWindowItem);

        jMenuBar1.add(editMenu);

        jMenu3.setText(bundle.getString("viewMenu.title")); // NOI18N

        consoleItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_0,
                java.awt.event.InputEvent.CTRL_MASK));
        consoleItem.setText(bundle.getString("consoleItem.title")); // NOI18N
        consoleItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                consoleItemActionPerformed(evt);
            }
        });
        jMenu3.add(consoleItem);

        historyItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_1,
                java.awt.event.InputEvent.CTRL_MASK));
        historyItem.setText(bundle.getString("historyItem.title")); // NOI18N
        historyItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                historyItemActionPerformed(evt);
            }
        });
        jMenu3.add(historyItem);

        filesItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_2,
                java.awt.event.InputEvent.CTRL_MASK));
        filesItem.setText(bundle.getString("filesItem.title")); // NOI18N
        filesItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                filesItemActionPerformed(evt);
            }
        });
        jMenu3.add(filesItem);

        workspaceItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_3,
                java.awt.event.InputEvent.CTRL_MASK));
        workspaceItem.setText(bundle.getString("worksaceItem.title")); // NOI18N
        workspaceItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                workspaceItemActionPerformed(evt);
            }
        });
        jMenu3.add(workspaceItem);

        codeEditorItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_4,
                java.awt.event.InputEvent.CTRL_MASK));
        codeEditorItem.setText(bundle.getString("codeEditorItem.title")); // NOI18N
        codeEditorItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                codeEditorItemActionPerformed(evt);
            }
        });
        jMenu3.add(codeEditorItem);

        pathsItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_5,
                java.awt.event.InputEvent.CTRL_MASK));
        pathsItem.setText(bundle.getString("setPathsItem.title")); // NOI18N
        pathsItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                pathsItemActionPerformed(evt);
            }
        });
        jMenu3.add(pathsItem);

        pkgsItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_6,
                java.awt.event.InputEvent.CTRL_MASK));
        pkgsItem.setText(bundle.getString("pkgsItem.title")); // NOI18N
        pkgsItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                pkgsItemActionPerformed(evt);
            }
        });
        jMenu3.add(pkgsItem);

        arrayEditItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_7,
                java.awt.event.InputEvent.CTRL_MASK));
        arrayEditItem.setText(bundle.getString("arrayEidtorItem.title")); // NOI18N
        arrayEditItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                arrayEditItemActionPerformed(evt);
            }
        });
        jMenu3.add(arrayEditItem);

        jMenuItem7.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_8,
                java.awt.event.InputEvent.CTRL_MASK));
        jMenuItem7.setText("Debugger Window");
        jMenuItem7.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem7ActionPerformed(evt);
            }
        });
        jMenu3.add(jMenuItem7);

        jMenuBar1.add(jMenu3);

        jMenu1.setMnemonic('S');
        jMenu1.setText("Search");

        findItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F,
                java.awt.event.InputEvent.CTRL_MASK));
        findItem.setIcon(
                new javax.swing.ImageIcon(getClass().getResource("/org/domainmath/gui/icons/edit-find.png"))); // NOI18N
        findItem.setMnemonic('F');
        findItem.setText("Find...");
        findItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                findItemActionPerformed(evt);
            }
        });
        jMenu1.add(findItem);

        replaceItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_H,
                java.awt.event.InputEvent.CTRL_MASK));
        replaceItem.setIcon(new javax.swing.ImageIcon(
                getClass().getResource("/org/domainmath/gui/icons/edit-find-replace.png"))); // NOI18N
        replaceItem.setText("Replace...");
        replaceItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                replaceItemActionPerformed(evt);
            }
        });
        jMenu1.add(replaceItem);

        gotoItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_G,
                java.awt.event.InputEvent.SHIFT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        gotoItem.setText("Go To...");
        gotoItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                gotoItemActionPerformed(evt);
            }
        });
        jMenu1.add(gotoItem);
        jMenu1.add(jSeparator25);

        googleItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_G,
                java.awt.event.InputEvent.CTRL_MASK));
        googleItem.setText("Google Search");
        googleItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                googleItemActionPerformed(evt);
            }
        });
        jMenu1.add(googleItem);

        wikiItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_W,
                java.awt.event.InputEvent.SHIFT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        wikiItem.setText("Wikipedia Search");
        wikiItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                wikiItemActionPerformed(evt);
            }
        });
        jMenu1.add(wikiItem);

        jMenuBar1.add(jMenu1);

        pkgMenu.setText(bundle.getString("pkgMenu.name")); // NOI18N
        jMenuBar1.add(pkgMenu);

        debugMenu.setText("Debug");

        runScriptItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F6, 0));
        runScriptItem
                .setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/domainmath/gui/icons/Run.png"))); // NOI18N
        runScriptItem.setText("Run Script");
        runScriptItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                runScriptItemActionPerformed(evt);
            }
        });
        debugMenu.add(runScriptItem);

        runScriptCItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F6,
                java.awt.event.InputEvent.SHIFT_MASK));
        runScriptCItem.setText("Run Script from Console");
        runScriptCItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                runScriptCItemActionPerformed(evt);
            }
        });
        debugMenu.add(runScriptCItem);

        jMenuItem8.setText("Edit Run Configuration");
        jMenuItem8.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem8ActionPerformed(evt);
            }
        });
        debugMenu.add(jMenuItem8);
        debugMenu.add(jSeparator8);

        debugScriptMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F5,
                java.awt.event.InputEvent.CTRL_MASK));
        debugScriptMenuItem.setText("Debug Script");
        debugScriptMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                debugScriptMenuItemActionPerformed(evt);
            }
        });
        debugMenu.add(debugScriptMenuItem);

        testScriptMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_T,
                java.awt.event.InputEvent.SHIFT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        testScriptMenuItem.setText("Test Script");
        testScriptMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                testScriptMenuItemActionPerformed(evt);
            }
        });
        debugMenu.add(testScriptMenuItem);

        toggleBreakpointItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F9, 0));
        toggleBreakpointItem.setIcon(
                new javax.swing.ImageIcon(getClass().getResource("/org/domainmath/gui/resources/stop.png"))); // NOI18N
        toggleBreakpointItem.setText("Toggle Breakpoint");
        toggleBreakpointItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                toggleBreakpointItemActionPerformed(evt);
            }
        });
        debugMenu.add(toggleBreakpointItem);

        removeToggleBreakpointItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F9,
                java.awt.event.InputEvent.SHIFT_MASK));
        removeToggleBreakpointItem.setText("Remove Toggle Breakpoint");
        removeToggleBreakpointItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                removeToggleBreakpointItemActionPerformed(evt);
            }
        });
        debugMenu.add(removeToggleBreakpointItem);

        clearAllBreakpointsItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F9,
                java.awt.event.InputEvent.SHIFT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        clearAllBreakpointsItem.setText("Clear All Breakpoints...");
        clearAllBreakpointsItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                clearAllBreakpointsItemActionPerformed(evt);
            }
        });
        debugMenu.add(clearAllBreakpointsItem);
        debugMenu.add(jSeparator10);

        stepItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F10,
                java.awt.event.InputEvent.SHIFT_MASK));
        stepItem.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/domainmath/gui/icons/step.png"))); // NOI18N
        stepItem.setText("Step");
        stepItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                stepItemActionPerformed(evt);
            }
        });
        debugMenu.add(stepItem);

        stepInItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F11, 0));
        stepInItem.setIcon(
                new javax.swing.ImageIcon(getClass().getResource("/org/domainmath/gui/icons/step-in.png"))); // NOI18N
        stepInItem.setText("Step in");
        stepInItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                stepInItemActionPerformed(evt);
            }
        });
        debugMenu.add(stepInItem);

        stepOutItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F11,
                java.awt.event.InputEvent.SHIFT_MASK));
        stepOutItem.setIcon(
                new javax.swing.ImageIcon(getClass().getResource("/org/domainmath/gui/icons/step-out.png"))); // NOI18N
        stepOutItem.setText("Step out");
        stepOutItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                stepOutItemActionPerformed(evt);
            }
        });
        debugMenu.add(stepOutItem);

        continueItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F8, 0));
        continueItem.setText("Continue");
        continueItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                continueItemActionPerformed(evt);
            }
        });
        debugMenu.add(continueItem);
        debugMenu.add(jSeparator5);

        finishDebugItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F5,
                java.awt.event.InputEvent.SHIFT_MASK));
        finishDebugItem
                .setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/domainmath/gui/icons/finish.png"))); // NOI18N
        finishDebugItem.setText("Finish Debugger Session");
        finishDebugItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                finishDebugItemActionPerformed(evt);
            }
        });
        debugMenu.add(finishDebugItem);

        jMenuBar1.add(debugMenu);

        toolsMenu.setMnemonic(java.util.ResourceBundle.getBundle("org/domainmath/gui/resources/DomainMath_en")
                .getString("ToolsMenu.mnemonic").charAt(0));
        toolsMenu.setText(bundle.getString("ToolsMenu.name")); // NOI18N

        fltkplotItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_R,
                java.awt.event.InputEvent.SHIFT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        fltkplotItem.setMnemonic(java.util.ResourceBundle.getBundle("org/domainmath/gui/resources/DomainMath_en")
                .getString("fltkPlotItem.mnemonic").charAt(0));
        fltkplotItem.setText(bundle.getString("fltkPlotItem.name")); // NOI18N
        fltkplotItem.setToolTipText(bundle.getString("fltkPlotItem.tooltip")); // NOI18N
        fltkplotItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                fltkplotItemActionPerformed(evt);
            }
        });
        toolsMenu.add(fltkplotItem);

        octaveCmdItem.setMnemonic(java.util.ResourceBundle.getBundle("org/domainmath/gui/resources/DomainMath_en")
                .getString("octaveCmdItem.mnemonic").charAt(0));
        octaveCmdItem.setText(bundle.getString("octaveCmdItem.name")); // NOI18N
        octaveCmdItem.setToolTipText(bundle.getString("octaveCmdItem.tooltip")); // NOI18N
        octaveCmdItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                octaveCmdItemActionPerformed(evt);
            }
        });
        toolsMenu.add(octaveCmdItem);

        jMenuBar1.add(toolsMenu);

        jMenu2.setText(bundle.getString("windowMenu.title")); // NOI18N

        previousWindowItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_PAGE_DOWN,
                java.awt.event.InputEvent.CTRL_MASK));
        previousWindowItem.setIcon(
                new javax.swing.ImageIcon(getClass().getResource("/org/domainmath/gui/icons/go-previous.png"))); // NOI18N
        previousWindowItem.setText(bundle.getString("previousWindowItem.title")); // NOI18N
        previousWindowItem.setToolTipText(bundle.getString("previousWindowItem.tooltip")); // NOI18N
        previousWindowItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                previousWindowItemActionPerformed(evt);
            }
        });
        jMenu2.add(previousWindowItem);

        nextWindowItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_PAGE_UP,
                java.awt.event.InputEvent.CTRL_MASK));
        nextWindowItem.setIcon(
                new javax.swing.ImageIcon(getClass().getResource("/org/domainmath/gui/icons/go-next.png"))); // NOI18N
        nextWindowItem.setText(bundle.getString("nextWindowItem.title")); // NOI18N
        nextWindowItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                nextWindowItemActionPerformed(evt);
            }
        });
        jMenu2.add(nextWindowItem);
        jMenu2.add(jSeparator29);

        closeItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_W,
                java.awt.event.InputEvent.ALT_MASK));
        closeItem.setText(bundle.getString("closeMenuItem.name")); // NOI18N
        closeItem.setToolTipText(bundle.getString("closeItem.tooltip")); // NOI18N
        closeItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                closeItemActionPerformed(evt);
            }
        });
        jMenu2.add(closeItem);

        closeAllItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_W,
                java.awt.event.InputEvent.ALT_MASK | java.awt.event.InputEvent.SHIFT_MASK));
        closeAllItem.setText(bundle.getString("closeAllItem.name")); // NOI18N
        closeAllItem.setToolTipText(bundle.getString("closeAllItem.tooltip")); // NOI18N
        closeAllItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                closeAllItemActionPerformed(evt);
            }
        });
        jMenu2.add(closeAllItem);
        jMenu2.add(jSeparator18);

        windowsItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F4,
                java.awt.event.InputEvent.SHIFT_MASK));
        windowsItem.setText(bundle.getString("windowsItem.title")); // NOI18N
        windowsItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                windowsItemActionPerformed(evt);
            }
        });
        jMenu2.add(windowsItem);

        jMenuBar1.add(jMenu2);

        helpMenu.setMnemonic(java.util.ResourceBundle.getBundle("org/domainmath/gui/resources/DomainMath_en")
                .getString("helpMenu.mnemonic").charAt(0));
        helpMenu.setText(bundle.getString("helpMenu.name")); // NOI18N

        forumItem.setText("Forum");
        forumItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                forumItemActionPerformed(evt);
            }
        });
        helpMenu.add(forumItem);

        octaveInfoItem.setMnemonic(java.util.ResourceBundle.getBundle("org/domainmath/gui/resources/DomainMath_en")
                .getString("octInfoItem.mnemonic").charAt(0));
        octaveInfoItem.setText(bundle.getString("octInfoItem.name")); // NOI18N
        octaveInfoItem.setToolTipText(bundle.getString("octInfoItem.tooltip")); // NOI18N
        octaveInfoItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                octaveInfoItemActionPerformed(evt);
            }
        });
        helpMenu.add(octaveInfoItem);
        helpMenu.add(jSeparator12);

        quickHelpItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F1, 0));
        quickHelpItem.setText(bundle.getString("quickHelpItem.name")); // NOI18N
        quickHelpItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                quickHelpItemActionPerformed(evt);
            }
        });
        helpMenu.add(quickHelpItem);

        jMenuItem9.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F1,
                java.awt.event.InputEvent.SHIFT_MASK));
        jMenuItem9.setText("Package  Documentation");
        jMenuItem9.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem9ActionPerformed(evt);
            }
        });
        helpMenu.add(jMenuItem9);

        docPkgItem.setText("Package Online  Documentation");
        docPkgItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                docPkgItemActionPerformed(evt);
            }
        });
        helpMenu.add(docPkgItem);

        referenceMenu.setText(bundle.getString("referencesMenu.name")); // NOI18N
        helpMenu.add(referenceMenu);

        referenceItem.setMnemonic(java.util.ResourceBundle.getBundle("org/domainmath/gui/resources/DomainMath_en")
                .getString("addReferencesItem.mnemonic").charAt(0));
        referenceItem.setText(bundle.getString("addReferencesItem.name")); // NOI18N
        referenceItem.setToolTipText(bundle.getString("addReferencesItem.tooltip")); // NOI18N
        referenceItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                referenceItemActionPerformed(evt);
            }
        });
        helpMenu.add(referenceItem);
        helpMenu.add(jSeparator6);

        checkForUpdatesMenuItem.setText(bundle.getString("checkForUpdatesMenuItem.text")); // NOI18N
        checkForUpdatesMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                checkForUpdatesMenuItemActionPerformed(evt);
            }
        });
        helpMenu.add(checkForUpdatesMenuItem);

        onlineHelpItem.setText("Help and Support");
        onlineHelpItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                onlineHelpItemActionPerformed(evt);
            }
        });
        helpMenu.add(onlineHelpItem);

        faqItem.setText("Online FAQ");
        faqItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                faqItemActionPerformed(evt);
            }
        });
        helpMenu.add(faqItem);
        helpMenu.add(jSeparator14);

        reportBugItem.setMnemonic(java.util.ResourceBundle.getBundle("org/domainmath/gui/resources/DomainMath_en")
                .getString("reportBugItem.mnemonic").charAt(0));
        reportBugItem.setText(bundle.getString("reportBugItem.name")); // NOI18N
        reportBugItem.setToolTipText(bundle.getString("reportBugItem.tooltip")); // NOI18N
        reportBugItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                reportBugItemActionPerformed(evt);
            }
        });
        helpMenu.add(reportBugItem);

        feedBackItem.setMnemonic(java.util.ResourceBundle.getBundle("org/domainmath/gui/resources/DomainMath_en")
                .getString("yourFeedbackItem.mnemonic").charAt(0));
        feedBackItem.setText(bundle.getString("yourFeedbackItem.name")); // NOI18N
        feedBackItem.setToolTipText(bundle.getString("yourFeedbackItem.tooltip")); // NOI18N
        feedBackItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                feedBackItemActionPerformed(evt);
            }
        });
        helpMenu.add(feedBackItem);
        helpMenu.add(jSeparator7);

        AboutItem.setMnemonic(java.util.ResourceBundle.getBundle("org/domainmath/gui/resources/DomainMath_en")
                .getString("aboutItem.mnemonic").charAt(0));
        AboutItem.setText(bundle.getString("aboutItem.name")); // NOI18N
        AboutItem.setToolTipText(bundle.getString("aboutItem.tooltip")); // NOI18N
        AboutItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                AboutItemActionPerformed(evt);
            }
        });
        helpMenu.add(AboutItem);

        jMenuBar1.add(helpMenu);

        setJMenuBar(jMenuBar1);

        pack();
    }// </editor-fold>//GEN-END:initComponents

    /**
     * Set Current directory of Octave.
     * @param dir 
     */
    public static void setDir(String dir) {
        MainFrame.addFolder(dir);
        MainFrame.dirComboBox.setSelectedItem(dir);
    }

    /**
     * Creates Reference menus
     */
    public void makeMenu() {
        try {
            Preferences pr = Preferences.userNodeForPackage(this.getClass());
            StringTokenizer t = new StringTokenizer(pr.get("Ref_list", null), "=;");

            while (t.hasMoreTokens()) {
                referenceMenu.add(new DocumentAction(t.nextToken(), t.nextToken()));
            }
        } catch (Exception ex) {
        }
    }

    private void AboutItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_AboutItemActionPerformed
        AboutDlg aboutDlg = new AboutDlg(this, true);
        aboutDlg.setLocationRelativeTo(this);
        aboutDlg.setVisible(true);
    }//GEN-LAST:event_AboutItemActionPerformed

    public static void setPath(String path) {
        try {
            URI uri = new URI(path);
            Desktop desktop = Desktop.getDesktop();
            desktop.browse(uri);
        } catch (URISyntaxException | IOException ex) {
        }
    }

    private void reportBugItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_reportBugItemActionPerformed
        setPath("http://domainmathide.freeforums.org/bugs-f3.html");
    }//GEN-LAST:event_reportBugItemActionPerformed

    private void feedBackItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_feedBackItemActionPerformed
        setPath("http://domainmathide.freeforums.org/feedback-f4.html");
    }//GEN-LAST:event_feedBackItemActionPerformed

    private void referenceItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_referenceItemActionPerformed
        DocDialog DocDlg = new DocDialog(this, true);
        DocDlg.setLocationRelativeTo(this);
        DocDlg.setVisible(true);
    }//GEN-LAST:event_referenceItemActionPerformed

    private void formWindowOpened(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowOpened
        this.setCursor(new Cursor(Cursor.WAIT_CURSOR));
        MainFrame.octavePanel.start();

        DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM,
                Locale.getDefault());

        String t = "# -- " + formatter.format(new Date()) + " -- #";

        histArea.append(t + "\n");

        String path = Character.toString('"') + System.getProperty("user.dir") + File.separator + "scripts"
                + Character.toString('"');

        MainFrame.octavePanel.evaluate("addpath(genpath(" + path + "));savepath();");
        MainFrame.octavePanel.evaluate("DomainMath_OctavePaths('" + parent_root + "DomainMath_OctavePaths.dat');");

        MainFrame.octavePanel
                .evaluate("DomainMath_OctavePackages('" + parent_root + "DomainMath_OctavePackages.dat');");
        MainFrame.octavePanel
                .evaluate("DomainMath_OctaveVariables('" + parent_root + "DomainMath_OctaveVariables.dat',whos);");
        // MainFrame.workspace.reload();
        MainFrame.octavePanel
                .evaluate("DomainMath_OctaveConfig('" + parent_root + "DomainMath_OctaveConfig.dat');");

        String f = System.getProperty("user.dir") + File.separator + "cache" + File.separator + "pkg_list.xml";
        MainFrame.octavePanel.evaluate("DomainMath_PkgContents('" + f + "');");

        loadLayout();
        MainFrame.reloadWorkspace();
        loadPackageAuto();
        setDirComboContent();
        this.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
        new ModuleLoader().load(this, false);
        DMILogger.msg("DMI is Ready.");
    }//GEN-LAST:event_formWindowOpened

    public void loadPackageAuto() {
        Preferences pr2 = Preferences.userNodeForPackage(this.getClass());
        String packageList = pr2.get("DomainMath_Packages", ";");

        StringTokenizer t = new StringTokenizer(packageList, ";");

        while (t.hasMoreTokens()) {
            MainFrame.octavePanel.evaluate("pkg load " + t.nextToken());
        }

    }

    public void saveFrameSize(int w, int h) {
        Preferences pr2 = Preferences.userNodeForPackage(this.getClass());
        pr2.putInt("Frame_width", w);
        pr2.putInt("Frame_height", h);

    }

    public void deleteText() {
        RSyntaxTextArea textArea = commandArea;
        boolean beep = true;
        if ((textArea != null) && (textArea.isEditable())) {
            try {
                Document doc = textArea.getDocument();
                Caret caret = textArea.getCaret();
                int dot = caret.getDot();
                int mark = caret.getMark();
                if (dot != mark) {
                    doc.remove(Math.min(dot, mark), Math.abs(dot - mark));
                    beep = false;
                } else if (dot < doc.getLength()) {
                    int delChars = 1;
                    if (dot < doc.getLength() - 1) {
                        String dotChars = doc.getText(dot, 2);
                        char c0 = dotChars.charAt(0);
                        char c1 = dotChars.charAt(1);
                        if (c0 >= '\uD800' && c0 <= '\uDBFF' && c1 >= '\uDC00' && c1 <= '\uDFFF') {
                            delChars = 2;
                        }
                    }
                    doc.remove(dot, delChars);
                    beep = false;
                }
            } catch (Exception bl) {
            }
        }

        if (beep) {
            UIManager.getLookAndFeel().provideErrorFeedback(textArea);
        }

        textArea.requestFocusInWindow();
    }

    private void exitItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exitItemActionPerformed
        exitApp();
    }//GEN-LAST:event_exitItemActionPerformed

    private void printItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_printItemActionPerformed
        try {
            octavePanel.outputArea.print();
        } catch (PrinterException ex) {
        }
    }//GEN-LAST:event_printItemActionPerformed

    private void preferencesItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_preferencesItemActionPerformed
        preferencesDlg.setLocationRelativeTo(this);
        preferencesDlg.setVisible(true);
    }//GEN-LAST:event_preferencesItemActionPerformed

    public void saveHistory(File file) {
        try {
            try (BufferedWriter r = new BufferedWriter(new FileWriter(file))) {
                DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG,
                        Locale.getDefault());
                r.append("# Created by DomainMath IDE on " + formatter.format(new Date()));
                r.newLine();
                histArea.write(r);
                r.close();
            }

        } catch (Exception re) {
            JOptionPane.showMessageDialog(this, re.toString(), "Error", JOptionPane.ERROR_MESSAGE);

        }
    }

    public void saveHistoryAs() {
        JFileChooser fc = new JFileChooser();

        FileNameExtensionFilter filter = new FileNameExtensionFilter("M-Files  (*.m)", "m");
        fc.setCurrentDirectory(new File(System.getProperty("user.dir") + File.separator + "works"));
        fc.setFileFilter(filter);
        fc.setMultiSelectionEnabled(false);

        fc.setDialogTitle("Save As");
        File file_save;
        int returnVal = fc.showSaveDialog(this);

        if (returnVal == JFileChooser.APPROVE_OPTION) {
            String path = fc.getSelectedFile().getAbsolutePath();
            if (!path.endsWith(".m")) {
                file_save = new File(fc.getSelectedFile().getAbsolutePath() + ".m");
                saveHistory(file_save);
            } else {
                file_save = new File(fc.getSelectedFile().getAbsolutePath() + ".m");
                saveHistory(file_save);
            }

        }
    }

    public void connect() {
        commandArea.setText(">>");
        octavePanel.outputArea.setText("");
        octavePanel.start();
        new Msg(this, "Octave connected.").setVisible(true);
        if (!commandArea.isEnabled()) {
            commandArea.setEnabled(true);

        }
    }

    public void disconnect() {
        octavePanel.quit();
        commandArea.setEnabled(false);
        new Msg(this, "Octave disconnected.").setVisible(true);
    }

    private void connectItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_connectItemActionPerformed
        connect();

        MainFrame.octavePanel.evaluate("DomainMath_OctavePaths('" + parent_root + "DomainMath_OctavePaths.dat');");

        MainFrame.octavePanel
                .evaluate("DomainMath_OctavePackages('" + parent_root + "DomainMath_OctavePackages.dat');");
        MainFrame.octavePanel
                .evaluate("DomainMath_OctaveVariables('" + parent_root + "DomainMath_OctaveVariables.dat',whos);");
        MainFrame.workspace.reload();
        MainFrame.workspace.reload();
        if (this.startupDir.equals("")) {
            setDir(System.getProperty("user.dir"));
            octavePanel.evaluate("chdir " + "'" + System.getProperty("user.dir") + "'");
        } else {
            setDir(startupDir);
            octavePanel.evaluate("chdir " + "'" + startupDir + "'");
        }

    }//GEN-LAST:event_connectItemActionPerformed

    private void disconnectItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_disconnectItemActionPerformed
        disconnect();
    }//GEN-LAST:event_disconnectItemActionPerformed

    private void clearOutWindowItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_clearOutWindowItemActionPerformed
        octavePanel.clear();
    }//GEN-LAST:event_clearOutWindowItemActionPerformed

    private void connectButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_connectButtonActionPerformed
        connect();
    }//GEN-LAST:event_connectButtonActionPerformed

    private void disconnectButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_disconnectButtonActionPerformed
        disconnect();
    }//GEN-LAST:event_disconnectButtonActionPerformed

    private void exitFinal(ShutDown shutDown) {
        MainFrame.workspace.requestToClearAll();
        MainFrame.reloadWorkspace();
        octavePanel.quit();
        File f = new File(System.getProperty("user.dir") + File.separator + "scripts" + File.separator + "dmns.m");
        f.deleteOnExit();
        File dir_content[];
        try {
            dir_content = logDir.listFiles();
            for (int i = 0; i < dir_content.length; i++) {
                Files.delete(dir_content[i].toPath());
            }
            Files.delete(logDir.toPath());
        } catch (IOException ex) {
            Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
        }

        this.saveLayout();
        File _f = new File(parent_root + "DomainMath_OctaveDbStack.dat");
        _f.delete();
        saveCurrentDir();
        try {
            FileUtils.deleteDirectory(new File(System.getProperty("user.dir") + File.separator + "doc_cache"));
        } catch (IOException ex) {
            Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
        }
        saveFrameSize(this.getWidth(), this.getHeight());
        shutDown.dispose();
        this.dispose();

        System.exit(0);
    }

    public void exitApp() {
        int j = fileTab.getTabCount() - 1;
        while (j != -1) {

            askSave(j);
            j--;
        }
        ShutDown shutDown = new ShutDown(this, "DomainMath IDE", "Really do you want to exit?");
        JButton yes = new JButton("Yes");
        JButton no = new JButton("No");
        JCheckBox confirmation = shutDown.getCheckBox();
        Preferences pr2 = Preferences.userNodeForPackage(this.getClass());
        boolean skipConfirmation = pr2.getBoolean("skip_confirmation", false);

        confirmation.addItemListener((ItemEvent e) -> {
            if (ItemEvent.DESELECTED == e.getStateChange()) {
                pr2.putBoolean("skip_confirmation", false);
            } else {
                pr2.putBoolean("skip_confirmation", true);
            }
        });

        yes.addActionListener((ActionEvent e) -> {
            exitFinal(shutDown);
        });
        no.addActionListener((ActionEvent e) -> {
            shutDown.dispose();
        });

        if (false == skipConfirmation) {
            shutDown.addButton(yes);
            shutDown.addButton(no);
            shutDown.setVisible(true);
        } else {
            exitFinal(shutDown);
        }
    }

    private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
        exitApp();
    }//GEN-LAST:event_formWindowClosing

    public void saveCurrentDir() {
        String s = "";
        ArrayList<String> l = new ArrayList<>();

        for (int i = 0; i < dirComboBox.getItemCount(); i++) {
            // s+=dirComboBox.getItemAt(i).toString()+File.pathSeparator;
            l.add(dirComboBox.getItemAt(i).toString());
        }

        if (l.contains(worksDir.getAbsolutePath())) {
            l.remove(worksDir.getAbsolutePath());
        }

        System.out.println("Directory list:" + l);

        for (String st : l) {
            s += st + File.pathSeparator;
        }
        Preferences pr2 = Preferences.userNodeForPackage(this.getClass());
        if (s != null) {
            pr2.put("DomainMath_CurrentDir", s);
            System.out.println("Saved current directory list:" + s);
        } else {
            pr2.put("DomainMath_CurrentDir", worksDir.getAbsolutePath());

        }

        pr2.put("DomainMath_StartUpDir", worksDir.getAbsolutePath());

    }

    public void setDirComboContent() {
        Preferences pr2 = Preferences.userNodeForPackage(this.getClass());
        String s = pr2.get("DomainMath_CurrentDir", "");
        ArrayList<String> l = new ArrayList<>();
        if (s != null) {
            StringTokenizer t = new StringTokenizer(s, File.pathSeparator);
            while (t.hasMoreTokens()) {

                // System.out.println(t.nextToken());
                l.add(t.nextToken());

            }
            System.out.println("Open:" + l);

            File _f;
            for (String st : l) {
                _f = new File(st);
                if (_f.exists()) {
                    addDirList(st);
                }
            }
            if (worksDir.exists()) {
                addDirList(worksDir.getAbsolutePath());
                cd(worksDir.getAbsolutePath());
            } else {
                worksDir.mkdir();
                addDirList(worksDir.getAbsolutePath());
                cd(worksDir.getAbsolutePath());
            }

        }
        //    else{
        //        addDirList(worksDir.getAbsolutePath());
        //    }

    }

    public String getSavedCurrentDir() {

        Preferences pr2 = Preferences.userNodeForPackage(this.getClass());
        return pr2.get("DomainMath_CurrentDir", null);

    }

    private void createFile(String path, String ext) {

        String name = path + "octave" + ext;
        String cmd = MainFrame.octavePath + " --persist " + Character.toString('"') + path + "dmns.m"
                + Character.toString('"');
        try {
            try (FileWriter w = new FileWriter(new File(name))) {
                w.write(cmd, 0, cmd.length());
                w.flush();
            }
        } catch (IOException ex) {
        }

    }

    private void addDirList(String dir) {
        try {
            File f = new File(dir);
            if (f.exists()) {
                setDir(dir);
                System.out.println("Added:" + dir);
                fileTreePanel.updateFileTree(f);
            } else {
                System.err.println(f.getAbsolutePath() + "not exist");
            }
        } catch (Exception e) {
        }
    }

    private void octaveCmdItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_octaveCmdItemActionPerformed
        ExternalEngine externalEngine = new ExternalEngine(this.octavePath + " --interactive");
        externalEngine.setTitle(this.octavePath);
        externalEngine.setLocationRelativeTo(this);
        externalEngine.setVisible(true);

    }//GEN-LAST:event_octaveCmdItemActionPerformed

    private void openscript(File file) {
        try {
            Desktop desktop = Desktop.getDesktop();
            desktop.open(file);
        } catch (Exception ioe) {
            JOptionPane.showMessageDialog(null, file.getAbsolutePath() + " doesn't exist");
        }
    }

    private void fltkplotItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fltkplotItemActionPerformed
        runHistory();
    }//GEN-LAST:event_fltkplotItemActionPerformed

    private void browseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_browseButtonActionPerformed
        JFileChooser fc = new JFileChooser();
        fc.setCurrentDirectory(new File(System.getProperty("user.dir") + File.separator + "works"));
        fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        fc.setMultiSelectionEnabled(false);

        Path browse_file;
        int returnVal = fc.showOpenDialog(this);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            browse_file = fc.getSelectedFile().toPath();
            setDir(browse_file.toString());
            requestToChangeDir(browse_file.toString());
            fileTreePanel.updateFileTree(fc.getSelectedFile());

        }

    }//GEN-LAST:event_browseButtonActionPerformed

    public static void evaluate(String cmd) {
        MainFrame.octavePanel.evaluate(cmd);
    }

    public static void evaluateWithOutput(String cmd) {
        MainFrame.octavePanel.evalWithOutput(cmd);
    }

    private void addButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addButtonActionPerformed
        String dir = MainFrame.dirComboBox.getSelectedItem().toString();
        int i = JOptionPane.showConfirmDialog(this, "Add this folder to Path List?-\n" + dir, "DomainMath IDE",
                JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE);

        if (i == JOptionPane.YES_OPTION) {
            MainFrame.octavePanel.evaluate("addpath(genpath(" + "'" + dir + "'));");
            MainFrame.octavePanel.evaluate("savepath();");
        }
    }//GEN-LAST:event_addButtonActionPerformed

    private void octaveInfoItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_octaveInfoItemActionPerformed
        File config_cache = new File(parent_root + "DomainMath_OctaveConfig.dat");
        OctaveConfigDialog octaveConfigDialog = new OctaveConfigDialog(this, true, config_cache);
        octaveConfigDialog.setLocationRelativeTo(this);
        octaveConfigDialog.setVisible(true);

    }//GEN-LAST:event_octaveInfoItemActionPerformed

    public void saveplot() {
        JFileChooser fc = new JFileChooser();
        fc.setCurrentDirectory(new File(System.getProperty("user.dir") + File.separator + "works"));
        fc.setFileFilter(DomainMathFileFilter.SAVE_PLOT_FILE_FILTER);
        fc.setAcceptAllFileFilterUsed(false);
        fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
        fc.setMultiSelectionEnabled(false);

        File file_plot;
        String name;
        int returnVal = fc.showSaveDialog(this);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            System.err.println(fc.getFileFilter().getDescription());
            file_plot = fc.getSelectedFile();
            name = file_plot.getName();
            evaluateWithOutput("saveas(1," + "'" + file_plot.getAbsolutePath() + "');");

        }
    }

    private void savePlotItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_savePlotItemActionPerformed
        saveplot();
    }//GEN-LAST:event_savePlotItemActionPerformed

    private void forumItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_forumItemActionPerformed
        setPath("http://domainmathide.freeforums.org/");
    }//GEN-LAST:event_forumItemActionPerformed

    private void faqItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_faqItemActionPerformed
        setPath("http://domainmathide.freeforums.org/faq-f8.html");
    }//GEN-LAST:event_faqItemActionPerformed

    private void onlineHelpItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_onlineHelpItemActionPerformed
        setPath("http://domainmathide.freeforums.org/help-and-support-f5.html");
    }//GEN-LAST:event_onlineHelpItemActionPerformed

    private int getFirstCharacter(Element row) {
        if (row == null) {
            return 0;
        }
        int lastColumnInRow = row.getEndOffset();
        return lastColumnInRow;
    }

    private void docPkgItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_docPkgItemActionPerformed
        setPath("http://octave.sourceforge.net/packages.php");
    }//GEN-LAST:event_docPkgItemActionPerformed

    private void quickHelpItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_quickHelpItemActionPerformed
        this.openInFlotingWindow(this.quickHelpView);
    }//GEN-LAST:event_quickHelpItemActionPerformed

    private void folderUpButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_folderUpButtonActionPerformed
        try {
            File f = new File(MainFrame.dirComboBox.getSelectedItem().toString());

            if (f.getParentFile().exists()) {
                setDir(f.getParent());
                requestToChangeDir(f.getParent());
                fileTreePanel.updateFileTree(f.getParentFile());
            } else {
                java.awt.Toolkit.getDefaultToolkit().beep();
            }
        } catch (Exception e) {
            System.out.println("No Parent");
        }
    }//GEN-LAST:event_folderUpButtonActionPerformed

    private void newFileItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newFileItemActionPerformed
        newFile();
    }//GEN-LAST:event_newFileItemActionPerformed

    private void openItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_openItemActionPerformed
        open();
    }//GEN-LAST:event_openItemActionPerformed

    private void saveFileItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveFileItemActionPerformed
        save();
    }//GEN-LAST:event_saveFileItemActionPerformed

    private void saveAllItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveAllItemActionPerformed
        for (int i = 0; i < fileTab.getTabCount(); i++) {

            String _file = fileTab.getToolTipTextAt(i);
            String fl = fileTab.getTitleAt(i);

            if (fl.endsWith("*")) {
                File f = new File(_file);
                save(f, i);
            }

        }
    }//GEN-LAST:event_saveAllItemActionPerformed

    private void closeItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_closeItemActionPerformed
        if (fileTab.getSelectedIndex() >= 0) {
            askSave(fileTab.getSelectedIndex());
        }
    }//GEN-LAST:event_closeItemActionPerformed

    private void closeAllItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_closeAllItemActionPerformed
        int i = fileTab.getTabCount() - 1;
        while (i != -1) {

            askSave(i);
            i--;
        }
    }//GEN-LAST:event_closeAllItemActionPerformed

    private void printFileItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_printFileItemActionPerformed
        printdoc();
    }//GEN-LAST:event_printFileItemActionPerformed

    private void undoItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_undoItemActionPerformed
        this.undo();
    }//GEN-LAST:event_undoItemActionPerformed

    private void redoItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_redoItemActionPerformed
        this.redo();
    }//GEN-LAST:event_redoItemActionPerformed

    private void cutItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cutItemActionPerformed
        this.cut();
    }//GEN-LAST:event_cutItemActionPerformed

    private void copyItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_copyItemActionPerformed
        this.copy();
    }//GEN-LAST:event_copyItemActionPerformed

    private void pasteItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_pasteItemActionPerformed
        this.paste();
    }//GEN-LAST:event_pasteItemActionPerformed

    private void deleteItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteItemActionPerformed
        this.deleteText();
    }//GEN-LAST:event_deleteItemActionPerformed

    private void selectAllItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_selectAllItemActionPerformed
        this.selectAll();
    }//GEN-LAST:event_selectAllItemActionPerformed

    private void jMenuItem6ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem6ActionPerformed
        if (fileTab.getSelectedIndex() >= 0) {
            RTextScrollPane t = (RTextScrollPane) fileTab.getComponentAt(fileTab.getSelectedIndex());
            RSyntaxTextArea selectedArea = (RSyntaxTextArea) t.getTextArea();
            selectedArea.removeAllLineHighlights();
        }
    }//GEN-LAST:event_jMenuItem6ActionPerformed

    private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem1ActionPerformed

    }//GEN-LAST:event_jMenuItem1ActionPerformed

    private void findItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_findItemActionPerformed
        if (fileTab.getSelectedIndex() >= 0) {
            RTextScrollPane t = (RTextScrollPane) fileTab.getComponentAt(fileTab.getSelectedIndex());
            RSyntaxTextArea selectedArea = (RSyntaxTextArea) t.getTextArea();
            FindAndReplaceDialog find = new FindAndReplaceDialog(this, false, fileTab,
                    selectedArea.getSelectedText());
            find.setVisible(true);

        }
    }//GEN-LAST:event_findItemActionPerformed

    private void replaceItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_replaceItemActionPerformed
        if (fileTab.getSelectedIndex() >= 0) {
            RTextScrollPane t = (RTextScrollPane) fileTab.getComponentAt(fileTab.getSelectedIndex());
            RSyntaxTextArea selectedArea = (RSyntaxTextArea) t.getTextArea();
            FindAndReplaceDialog find = new FindAndReplaceDialog(this, false, fileTab,
                    selectedArea.getSelectedText());
            find.setVisible(true);

        }
    }//GEN-LAST:event_replaceItemActionPerformed

    public void gotoLine(String goto_file, int lineRequested) {
        if (fileTab.getSelectedIndex() >= 0) {
            int indexOf = MainFrame.fileNameList.indexOf(goto_file);
            RTextScrollPane t = (RTextScrollPane) fileTab.getComponentAt(indexOf);
            RSyntaxTextArea selectedArea = (RSyntaxTextArea) t.getTextArea();
            try {
                Element element = selectedArea.getDocument().getDefaultRootElement();

                int rowCount = element.getElementCount();
                if (lineRequested > rowCount || lineRequested < 0) {

                    setVisible(false);
                    return;
                }
                Element row = null;
                int firstCharacter = 0;
                int rowNumber = 0;
                for (int i = 0; i < lineRequested; ++i) {
                    firstCharacter = getFirstCharacter(row);
                    rowNumber = element.getElementIndex(firstCharacter);
                    row = element.getElement(rowNumber);
                }
                int lastColumnInRow = row.getEndOffset();
                selectedArea.select(firstCharacter, lastColumnInRow - 1);

            } catch (Exception e) {

            }
        }
    }

    private void gotoItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_gotoItemActionPerformed
        if (fileTab.getSelectedIndex() >= 0) {
            String s = JOptionPane.showInputDialog("Line Number:");
            RTextScrollPane t = (RTextScrollPane) fileTab.getComponentAt(fileTab.getSelectedIndex());
            RSyntaxTextArea selectedArea = (RSyntaxTextArea) t.getTextArea();
            try {
                Element element = selectedArea.getDocument().getDefaultRootElement();
                int lineRequested = Integer.parseInt(s);
                int rowCount = element.getElementCount();
                if (lineRequested > rowCount || lineRequested < 0) {

                    setVisible(false);
                    return;
                }
                Element row = null;
                int firstCharacter = 0;
                int rowNumber = 0;
                for (int i = 0; i < lineRequested; ++i) {
                    firstCharacter = getFirstCharacter(row);
                    rowNumber = element.getElementIndex(firstCharacter);
                    row = element.getElement(rowNumber);
                }
                int lastColumnInRow = row.getEndOffset();
                selectedArea.select(firstCharacter, lastColumnInRow - 1);

            } catch (Exception e) {

            }
        }
    }//GEN-LAST:event_gotoItemActionPerformed

    private void googleItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_googleItemActionPerformed
        if (fileTab.getSelectedIndex() >= 0) {
            RTextScrollPane t = (RTextScrollPane) fileTab.getComponentAt(fileTab.getSelectedIndex());
            RSyntaxTextArea selectedArea = (RSyntaxTextArea) t.getTextArea();
            String s = selectedArea.getSelectedText();
            if (!s.equals("")) {
                String f = "http://www.google.com/search?q=" + s.replaceAll(" ", "+");
                setPath(f);
            }

        }
    }//GEN-LAST:event_googleItemActionPerformed

    private void wikiItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_wikiItemActionPerformed
        if (fileTab.getSelectedIndex() >= 0) {
            RTextScrollPane t = (RTextScrollPane) fileTab.getComponentAt(fileTab.getSelectedIndex());
            RSyntaxTextArea selectedArea = (RSyntaxTextArea) t.getTextArea();
            String s = selectedArea.getSelectedText();
            if (!s.equals("")) {
                String f = "http://en.wikipedia.org/wiki/Special:Search?search=" + s.replaceAll(" ", "+");
                setPath(f);
            }

        }
    }//GEN-LAST:event_wikiItemActionPerformed

    private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton4ActionPerformed
        this.undo();
    }//GEN-LAST:event_jButton4ActionPerformed

    private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton5ActionPerformed
        this.redo();
    }//GEN-LAST:event_jButton5ActionPerformed

    private void jButton6ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton6ActionPerformed
        this.cut();
    }//GEN-LAST:event_jButton6ActionPerformed

    private void jButton7ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton7ActionPerformed
        this.copy();
    }//GEN-LAST:event_jButton7ActionPerformed

    private void jButton8ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton8ActionPerformed
        this.paste();
    }//GEN-LAST:event_jButton8ActionPerformed

    private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton3ActionPerformed
        for (int i = 0; i < fileTab.getTabCount(); i++) {

            String _file = fileTab.getToolTipTextAt(i);
            String fl = fileTab.getTitleAt(i);

            if (fl.endsWith("*")) {
                File f = new File(_file);
                save(f, i);
            }

        }
    }//GEN-LAST:event_jButton3ActionPerformed

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
        open();
    }//GEN-LAST:event_jButton2ActionPerformed

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
        newFile();

    }//GEN-LAST:event_jButton1ActionPerformed

    /**
     * Run script.
     */
    private void runFile(Path path) {
        File file_selected = path.toFile();
        String f = file_selected.getName();
        String config_name = file_selected.getName().substring(0, f.lastIndexOf(".")) + ".rcfg";
        File cfg = new File(file_selected.getParent() + File.separator + config_name);
        try {

            JAXBContext jaxbContext = JAXBContext.newInstance(RunConfigurations.class);

            Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
            RunConfigurations runConfig = (RunConfigurations) jaxbUnmarshaller.unmarshal(cfg);
            int selectedIndex = runConfig.getIndex();
            List<RunConfiguration> runConfiguration = runConfig.getRunConfiguration();
            MainFrame.octavePanel.evalWithOutput(runConfiguration.get(selectedIndex).getConfig());
            reloadWorkspace();
        } catch (JAXBException ex) {
            String name = path.getFileName().toString();
            String ext = name.substring(name.lastIndexOf("."));

            if (ext.equalsIgnoreCase(".m")) {
                String m_file_name = name.substring(0, name.indexOf(".m"));
                MainFrame.octavePanel.evalWithOutput(m_file_name + "()");

                reloadWorkspace();

            }

        }
    }

    private void runFile2(Path path) {
        File file_selected = path.toFile();
        String f = file_selected.getName();
        String config_name = file_selected.getName().substring(0, f.lastIndexOf(".")) + ".rcfg";
        File cfg = new File(file_selected.getParent() + File.separator + config_name);
        try {

            JAXBContext jaxbContext = JAXBContext.newInstance(RunConfigurations.class);

            Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
            RunConfigurations runConfig = (RunConfigurations) jaxbUnmarshaller.unmarshal(cfg);
            int selectedIndex = runConfig.getIndex();
            List<RunConfiguration> runConfiguration = runConfig.getRunConfiguration();

            ExternalEngine externalEngine = new ExternalEngine(this.octavePath + " --interactive");
            externalEngine.setTitle(octavePath);
            externalEngine.setLocationRelativeTo(this);
            externalEngine.setVisible(true);
            externalEngine.execute("cd '" + path.getParent() + "'\n");
            externalEngine.execute(runConfiguration.get(selectedIndex).getConfig());

        } catch (JAXBException ex) {
            String name = path.getFileName().toString();
            String ext = name.substring(name.lastIndexOf("."));

            if (ext.equalsIgnoreCase(".m")) {
                String m_file_name = name.substring(0, name.indexOf(".m"));

                ExternalEngine externalEngine = new ExternalEngine(this.octavePath + " --interactive");
                externalEngine.setTitle(octavePath);
                externalEngine.setLocationRelativeTo(this);
                externalEngine.setVisible(true);
                externalEngine.execute("cd '" + path.getParent() + "'\n");
                externalEngine.execute(m_file_name + "()");
            }

        }
    }

    public void newFile() {
        NewScriptDialog newFileDlg = new NewScriptDialog(this, true);
        newFileDlg.setLocationRelativeTo(this);
        newFileDlg.setVisible(true);
        this.openInFlotingWindow(this.fileTabView);
    }

    public void needOct(boolean need) {
        AutoCompletion ac = new AutoCompletion(provider1);

        if (need) {
            ac.install(this.areaFileTab);

        } else {
            ac.uninstall();
        }
    }

    public CompletionProvider createCompletionProvider() {

        DefaultCompletionProvider provider = new DefaultCompletionProvider();

        JList l = new JList();

        AutoCompleteListCellRenderer cellRender = new AutoCompleteListCellRenderer(l.getFont(), l.getBackground(),
                l.getForeground(), l.getSelectionBackground(), l.getSelectionForeground());
        provider.setListCellRenderer(cellRender);

        OctaveM _m = new OctaveM();
        List a = _m.getKey("DomainMath_OctaveAutoComplete.ini");

        for (int i = 0; i < a.size(); i++) {
            provider.addCompletion(new BasicCompletion(provider, a.get(i).toString()));
        }

        return provider;

    }

    public void save(File file, int index) {

        try {
            try (BufferedWriter r = new BufferedWriter(new FileWriter(file))) {
                this.fileTab.setTitleAt(index, file.getName());
                RTextScrollPane t = (RTextScrollPane) fileTab.getComponentAt(index);
                RSyntaxTextArea a = (RSyntaxTextArea) t.getTextArea();
                a.write(r);
                r.close();
                this.setCurrentDirFileTab(file.getParent());
            }

        } catch (Exception re) {
            JOptionPane.showMessageDialog(this, re.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);

        }
    }

    private void printdoc() {
        if (fileTab.getSelectedIndex() >= 0) {
            try {
                RTextScrollPane t = (RTextScrollPane) fileTab.getComponentAt(fileTab.getSelectedIndex());
                RSyntaxTextArea selectedArea = (RSyntaxTextArea) t.getTextArea();
                selectedArea.print();
            } catch (PrinterException ex) {

            }
        }

    }

    private void popupTab() {
        JPopupMenu popup = new JPopupMenu();
        JMenuItem pcloseItem = new JMenuItem("Close");
        JMenuItem pcloseAllItem = new JMenuItem("Close All");

        popup.add(pcloseItem);
        popup.add(pcloseAllItem);
        fileTab.addMouseListener(new MainFrame.PopupListener(popup));

        pcloseItem.addActionListener((ActionEvent e) -> {
            if (fileTab.getSelectedIndex() >= 0) {
                askSave(fileTab.getSelectedIndex());
            }
        });

        pcloseAllItem.addActionListener((ActionEvent e) -> {
            int i = fileTab.getTabCount() - 1;
            while (i != -1) {

                askSave(i);
                i--;
            }
        });
    }

    /**
     * It closes a file.
     * @param selectedIndex 
     */
    public void askSave(int selectedIndex) {
        String s = fileTab.getTitleAt(selectedIndex);

        if (s.endsWith("*")) { //modified document.
            String f = s.substring(0, s.lastIndexOf("*"));

            // ask to save file.
            int i = JOptionPane.showConfirmDialog(this, "Do you want to save changes in " + f + " ?",
                    "DomainMath IDE", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);

            if (i == JOptionPane.YES_OPTION) { //need to save file

                // add this file to recent menu list.
                File selected_file = new File(fileTab.getToolTipTextAt(selectedIndex));
                recentFileMenu.addEntry(selected_file.getAbsolutePath());

                // save the file.
                save(selected_file, selectedIndex);

                // close the file.
                this.removeFileNameFromList(selectedIndex);
                fileTab.remove(selectedIndex);
                FILE_TAB_INDEX--;

            } else if (i == JOptionPane.NO_OPTION) { // I dont need to save the file.

                // add this file to recent menu list.
                File selected_file = new File(fileTab.getToolTipTextAt(selectedIndex));
                recentFileMenu.addEntry(selected_file.getAbsolutePath());

                // close the file.
                this.removeFileNameFromList(selectedIndex);
                fileTab.remove(selectedIndex);
                FILE_TAB_INDEX--;

            }
        } else { //unmodified file.

            // add this file to recent menu list.
            File selected_file = new File(fileTab.getToolTipTextAt(selectedIndex));
            recentFileMenu.addEntry(selected_file.getAbsolutePath());

            // close the file.
            removeFileNameFromList(selectedIndex);
            fileTab.remove(selectedIndex);
            FILE_TAB_INDEX--;
        }
    }

    private void createRootWindow() {
        viewMap.addView(0, fileTabView);
        viewMap.addView(1, pathsView);
        viewMap.addView(2, pkgView);
        viewMap.addView(3, consoleView);
        viewMap.addView(4, arrayEditorView);
        viewMap.addView(5, workspaceView);
        viewMap.addView(6, filesView);
        viewMap.addView(7, historyView);
        viewMap.addView(8, debuggerView);
        viewMap.addView(9, quickHelpView);

        MixedViewHandler handler = new MixedViewHandler(viewMap, new ViewSerializer() {

            @Override
            public void writeView(View view, ObjectOutputStream out) throws IOException {
                out.writeInt(((DynamicView) view).getId());
            }

            @Override
            public View readView(ObjectInputStream in) throws IOException {
                return getDynamicView(in.readInt());
            }
        });
        rootWindow = DockingUtil.createRootWindow(viewMap, handler, true);

        properties.addSuperObject(currentTheme.getRootWindowProperties());
        properties.addSuperObject(titleBarStyleProperties);
        rootWindow.getRootWindowProperties().addSuperObject(properties);

        rootWindow.getWindowBar(Direction.DOWN).setEnabled(true);

        rootWindow.addListener(new DockingWindowAdapter() {
            @Override
            public void windowAdded(DockingWindow addedToWindow, DockingWindow addedWindow) {
                updateViews(addedWindow, true);
            }

            @Override
            public void windowRemoved(DockingWindow removedFromWindow, DockingWindow removedWindow) {
                updateViews(removedWindow, false);
            }

            @Override
            public void windowClosing(DockingWindow window) throws OperationAbortedException {
            }

            @Override
            public void windowDocking(DockingWindow window) throws OperationAbortedException {
            }

            @Override
            public void windowUndocking(DockingWindow window) throws OperationAbortedException {
            }
        });

        rootWindow.addTabMouseButtonListener(DockingWindowActionMouseButtonListener.MIDDLE_BUTTON_CLOSE_LISTENER);
    }

    private void updateViews(DockingWindow window, boolean added) {
        if (window instanceof View) {
            if (window instanceof DynamicView) {
                if (added) {
                    dynamicViews.put(new Integer(((DynamicView) window).getId()), window);
                } else {
                    dynamicViews.remove(new Integer(((DynamicView) window).getId()));
                }
            } else {
            }
        } else {
            for (int i = 0; i < window.getChildWindowCount(); i++) {
                updateViews(window.getChildWindow(i), added);
            }
        }
    }

    private View getDynamicView(int id) {
        View view = (View) dynamicViews.get(new Integer(id));

        if (view == null) {
            if (id == 0) {
                view = fileTabView;
            } else if (id == 1) {
                view = pathsView;
            } else if (id == 2) {
                view = pkgView;
            } else if (id == 3) {
                view = consoleView;
            } else if (id == 4) {
                view = arrayEditorView;
            } else if (id == 5) {
                view = workspaceView;
            } else if (id == 6) {
                view = filesView;
            } else if (id == 7) {
                view = historyView;
            } else if (id == 8) {
                view = debuggerView;
            } else if (id == 9) {
                view = quickHelpView;
            }
        }
        return view;
    }

    private void setDefaultLayout() {
        workspaceAndFilesTabWindow.addTab(this.workspaceView);
        workspaceAndFilesTabWindow.addTab(this.filesView);

        workspaceView.restoreFocus();

        SplitWindow leftSplitWindow = new SplitWindow(false, 0.7f, this.workspaceAndFilesTabWindow,
                this.historyView);

        rootWindow.setWindow(new SplitWindow(true, 0.3f, leftSplitWindow, consoleView));

        WindowBar windowBar = rootWindow.getWindowBar(Direction.DOWN);

        while (windowBar.getChildWindowCount() > 0) {
            windowBar.getChildWindow(0).close();
        }
    }

    class PopupListener extends MouseAdapter {
        JPopupMenu popup;

        PopupListener(JPopupMenu popupMenu) {
            popup = popupMenu;
        }

        @Override
        public void mousePressed(MouseEvent e) {
            maybeShowPopup(e);
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            maybeShowPopup(e);
        }

        private void maybeShowPopup(MouseEvent e) {
            if (e.isPopupTrigger() && fileTab.getTabCount() > 0) {
                popup.show(e.getComponent(), e.getX(), e.getY());
            }
        }
    }

    public void executeScript(File file_selected) {
        requestToChangeDir(file_selected.getParent());
        setDir(file_selected.getParent());
        this.runFile(Paths.get(file_selected.getAbsolutePath()));
        fileTreePanel.updateFileTree(file_selected.getParentFile());
    }

    public void changeDirectory(File f) {
        if (f.exists()) {
            setDir(f.getAbsolutePath());
            requestToChangeDir(f.getAbsolutePath());
            fileTreePanel.updateFileTree(f);
        }
    }

    private void runScriptItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_runScriptItemActionPerformed
        if (fileTab.getSelectedIndex() >= 0) {
            save();
            File file_selected = new File(fileTab.getToolTipTextAt(fileTab.getSelectedIndex()));
            executeScript(file_selected);
        }
    }//GEN-LAST:event_runScriptItemActionPerformed

    private void finishDebugItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_finishDebugItemActionPerformed
        MainFrame.octavePanel.evalWithOutput("dbquit");
        File f = new File(parent_root + "DomainMath_OctaveDbStack.dat");
        f.delete();
        clearAllBreakPoints();
        this.breakPointList.removeAll(this.breakPointList);
    }//GEN-LAST:event_finishDebugItemActionPerformed

    private void stepItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_stepItemActionPerformed
        MainFrame.octavePanel.evalWithOutput("dbstep");
        createStackData();

    }//GEN-LAST:event_stepItemActionPerformed

    private void stepInItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_stepInItemActionPerformed
        MainFrame.octavePanel.evalWithOutput("dbstep in");
        createStackData();

    }//GEN-LAST:event_stepInItemActionPerformed

    private void stepOutItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_stepOutItemActionPerformed
        MainFrame.octavePanel.evalWithOutput("dbstep out");
        createStackData();

    }//GEN-LAST:event_stepOutItemActionPerformed

    private void setToggleBreakpoint(int n) {
        if (fileTab.getSelectedIndex() >= 0) {
            save();

            String file_selected = fileTab.getTitleAt(fileTab.getSelectedIndex());
            if (file_selected.endsWith(".m")) {

                String ftn_name = file_selected.substring(0, file_selected.indexOf(".m"));
                RTextScrollPane t = (RTextScrollPane) fileTab.getComponentAt(fileTab.getSelectedIndex());
                RSyntaxTextArea selectedArea = (RSyntaxTextArea) t.getTextArea();

                octavePanel.evalWithOutput("dbstop ('" + ftn_name + "'," + n + ")");

            }
        } else {
            System.out.println("Hello");
        }

    }

    /**
     * remove toggle breakpoint.
     */
    private void removeToggleBreakpoint() {
        if (fileTab.getSelectedIndex() >= 0) {
            save();

            String file_selected = fileTab.getTitleAt(fileTab.getSelectedIndex());
            if (file_selected.endsWith(".m")) {
                String ftn_name = file_selected.substring(0, file_selected.indexOf(".m"));
                RTextScrollPane t = (RTextScrollPane) fileTab.getComponentAt(fileTab.getSelectedIndex());
                RSyntaxTextArea selectedArea = (RSyntaxTextArea) t.getTextArea();

                octavePanel
                        .evalWithOutput("dbclear ('" + ftn_name + "'," + selectedArea.getCaretLineNumber() + ")");
            }
        } else {
            System.out.println("Hello");
        }
    }

    public void setContinueMark(String goto_file, int n) {
        if (fileTab.getSelectedIndex() >= 0) {
            int indexOf = MainFrame.fileNameList.indexOf(goto_file);
            RTextScrollPane t = (RTextScrollPane) fileTab.getComponentAt(indexOf);
            RSyntaxTextArea selectedArea = (RSyntaxTextArea) t.getTextArea();

            // remove any previous continue mark.  
            for (GutterIconInfo f : debugMarksList) {
                t.getGutter().removeTrackingIcon(f);
            }

            Breakpoint breakpoint = new Breakpoint(new File(goto_file), (n - 1));
            for (Breakpoint b : breakPointList) {
                if (Breakpoint.compare(b, breakpoint)) {
                    try {
                        t.getGutter().removeBookmark((n - 1));
                        GutterIconInfo addLineTrackingIcon = t.getGutter().addLineTrackingIcon((n - 1),
                                new ImageIcon(getClass().getResource("resources/continue_break.png")));
                    } catch (BadLocationException ex) {
                    }
                } else {
                    // add Continue mark.
                    if (n > 0) {
                        try {
                            GutterIconInfo addLineTrackingIcon = t.getGutter().addLineTrackingIcon((n - 1),
                                    new ImageIcon(getClass().getResource("resources/continue.png")));
                            debugMarksList.add(addLineTrackingIcon);
                        } catch (BadLocationException ex) {
                        }
                    }
                }
            }
        }
    }

    public void makeBreakPoint() {
        if (fileTab.getSelectedIndex() >= 0) {
            RTextScrollPane t = (RTextScrollPane) fileTab.getComponentAt(fileTab.getSelectedIndex());
            final RSyntaxTextArea selectedArea = (RSyntaxTextArea) t.getTextArea();

            try {
                File f = new File(fileTab.getToolTipTextAt(fileTab.getSelectedIndex()));

                MainFrame.octavePanel.evaluate("chdir " + "'" + f.getParent() + "'");
                setToggleBreakpoint(selectedArea.getCaretLineNumber() + 1);
                GutterIconInfo addLineTrackingIcon = t.getGutter()
                        .addLineTrackingIcon(selectedArea.getCaretLineNumber(), new ImageIcon(urlDebugImageStop));
                Breakpoint breakpoint = new Breakpoint(f, selectedArea.getCaretLineNumber() + 1);
                breakpoint.setPoint(
                        new Point(addLineTrackingIcon.getMarkedOffset(), addLineTrackingIcon.getMarkedOffset()));
                breakPointMarksList.add(addLineTrackingIcon);
                breakPointList.add(breakpoint);
            } catch (BadLocationException ex) {
            }
        }
    }

    private void toggleBreakpointItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_toggleBreakpointItemActionPerformed
        makeBreakPoint();
    }//GEN-LAST:event_toggleBreakpointItemActionPerformed

    private void clearAllBreakpointsItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_clearAllBreakpointsItemActionPerformed
        clearAllBreakPoints();
        this.breakPointList.removeAll(this.breakPointList);
    }//GEN-LAST:event_clearAllBreakpointsItemActionPerformed

    private void removeToggleBreakpointItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removeToggleBreakpointItemActionPerformed
        if (fileTab.getSelectedIndex() >= 0) {
            RTextScrollPane t = (RTextScrollPane) fileTab.getComponentAt(fileTab.getSelectedIndex());
            RSyntaxTextArea selectedArea = (RSyntaxTextArea) t.getTextArea();
            try {
                File f = new File(fileTab.getToolTipTextAt(fileTab.getSelectedIndex()));
                GutterIconInfo[] trackingIcons = gutterFileTab
                        .getTrackingIcons(selectedArea.getCaret().getMagicCaretPosition());
                removeToggleBreakpoint();
                t.getGutter().removeTrackingIcon(trackingIcons[0]);
                Breakpoint breakpoint = new Breakpoint(f, trackingIcons[0].getMarkedOffset());
                this.breakPointList.remove(breakpoint);
            } catch (Exception ex) {
            }
        }
    }//GEN-LAST:event_removeToggleBreakpointItemActionPerformed

    private void continueItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_continueItemActionPerformed
        MainFrame.octavePanel.evalWithOutput("dbcont");
        File f = new File(parent_root + "DomainMath_OctaveDbStack.dat");
        f.delete();
        clearAllBreakPoints();
    }//GEN-LAST:event_continueItemActionPerformed

    private void saveAsItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveAsItemActionPerformed
        if (fileTab.getSelectedIndex() >= 0) {
            saveScriptAs();
        }
    }//GEN-LAST:event_saveAsItemActionPerformed

    /**
     * Change current directory to another directory.
     * @param s 
     */
    public void cd(String s) {
        File f = new File(s);
        if (f.exists()) {
            octavePanel.evaluate("chdir " + "'" + s + "'");
            fileTreePanel.updateFileTree(f);
        } else {
            JOptionPane.showMessageDialog(this, "Directory not exist", "Error", JOptionPane.ERROR_MESSAGE);
        }
    }

    public static void addFolder(String s) {
        for (int i = 0; i < dirComboBox.getItemCount(); i++) {
            if (s == dirComboBox.getItemAt(i)) {
                System.out.println("Repeated");
            } else {
                dirComboBox.removeItem(s);
                dirComboBox.insertItemAt(s, 0);
                dirComboBox.setSelectedIndex(0);

                break;
            }
        }
    }

    private void dirComboBoxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_dirComboBoxItemStateChanged
        if (evt.getStateChange() == ItemEvent.SELECTED) {
            Object s = this.dirComboBox.getSelectedItem();
            int n = dirComboBox.getItemCount();

            if (dirComboBox.getSelectedIndex() <= -1) {
                if (n == 0) {
                    dirComboBox.addItem(s);
                    cd(s.toString());
                } else {
                    for (int i = 0; i < dirComboBox.getItemCount(); i++) {
                        if (s == dirComboBox.getItemAt(i)) {
                            System.out.println("Repeated");
                        } else {
                            dirComboBox.removeItem(s);
                            dirComboBox.insertItemAt(s, 0);
                            dirComboBox.setSelectedIndex(0);
                            cd(s.toString());
                            break;
                        }
                    }
                }
            } else {
                if (dirComboBox.getSelectedIndex() > 0) {
                    Object item = dirComboBox.getSelectedItem();
                    dirComboBox.removeItem(item);
                    dirComboBox.insertItemAt(item, 0);

                    dirComboBox.setSelectedIndex(0);
                    cd(item.toString());
                }
            }
        }
    }//GEN-LAST:event_dirComboBoxItemStateChanged

    public void dragNDrop() {
        FileDrop fileDrop = new FileDrop(System.out, fileTab, /*dragBorder,*/ new FileDrop.Listener() {
            @Override
            public void filesDropped(java.io.File[] files) {
                for (int i = 0; i < files.length; i++) {
                    try {
                        File file1 = files[i];
                        if (!MainFrame.fileNameList.contains(file1.getAbsolutePath())) {

                            open(file1, MainFrame.FILE_TAB_INDEX);
                            setCurrentDirFileTab(file1.getParent());
                        } else {
                            System.out.println(file1.getAbsolutePath() + " already open!");
                        }
                    } catch (Exception e) {
                    }
                }
            }
        });

    }

    private void previousWindowItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_previousWindowItemActionPerformed
        if (fileTab.getSelectedIndex() >= 0) {
            if (fileTab.getSelectedIndex() != 0) {
                fileTab.setSelectedIndex((fileTab.getSelectedIndex() - 1));
            }
        }

    }//GEN-LAST:event_previousWindowItemActionPerformed

    private void nextWindowItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_nextWindowItemActionPerformed
        if (fileTab.getSelectedIndex() >= 0) {
            try {
                fileTab.setSelectedIndex((fileTab.getSelectedIndex() + 1));
            } catch (Exception e) {
                fileTab.setSelectedIndex(0);
            }
        }
    }//GEN-LAST:event_nextWindowItemActionPerformed

    private void focusView(View view) {
        if (view.getRootWindow() != null) {
            view.restoreFocus();
        } else {
            DockingUtil.addWindow(view, rootWindow);
        }
    }

    private void codeEditorItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_codeEditorItemActionPerformed
        focusView(this.fileTabView);
    }//GEN-LAST:event_codeEditorItemActionPerformed

    private void pathsItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_pathsItemActionPerformed
        this.openInFlotingWindow(this.pathsView);
    }//GEN-LAST:event_pathsItemActionPerformed

    private void pkgsItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_pkgsItemActionPerformed
        this.openInFlotingWindow(this.pkgView);
    }//GEN-LAST:event_pkgsItemActionPerformed

    private void consoleItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_consoleItemActionPerformed
        focusView(this.consoleView);
    }//GEN-LAST:event_consoleItemActionPerformed

    private void arrayEditItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_arrayEditItemActionPerformed
        this.openInFlotingWindow(this.arrayEditorView);
    }//GEN-LAST:event_arrayEditItemActionPerformed

    private void workspaceItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_workspaceItemActionPerformed
        focusView(this.workspaceView);
    }//GEN-LAST:event_workspaceItemActionPerformed

    private void filesItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_filesItemActionPerformed
        focusView(this.filesView);
    }//GEN-LAST:event_filesItemActionPerformed

    private void historyItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_historyItemActionPerformed
        focusView(this.historyView);
    }//GEN-LAST:event_historyItemActionPerformed

    private void windowsItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_windowsItemActionPerformed
        WindowsDialog windowsDialog = new WindowsDialog(this, true);
        windowsDialog.setLocationRelativeTo(this);
        windowsDialog.setVisible(true);
    }//GEN-LAST:event_windowsItemActionPerformed

    private void testScriptMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_testScriptMenuItemActionPerformed
        if (fileTab.getSelectedIndex() >= 0) {
            save();
            File file_selected = new File(fileTab.getToolTipTextAt(fileTab.getSelectedIndex()));
            requestToChangeDir(file_selected.getParent());
            setDir(file_selected.getParent());
            Path path = Paths.get(file_selected.getAbsolutePath());

            String name = path.getFileName().toString();
            String ext = name.substring(name.lastIndexOf("."));

            if (ext.equalsIgnoreCase(".m")) {
                String m_file_name = name.substring(0, name.indexOf(".m"));
                evaluateWithOutput("test " + m_file_name);

                reloadWorkspace();
            }

        }
    }//GEN-LAST:event_testScriptMenuItemActionPerformed

    public void createStackData() {
        MainFrame.octavePanel.evaluate("dbstack_data=dbstack;");
        MainFrame.octavePanel.evaluate(
                "DomainMath_OctaveDbStack('" + parent_root + "DomainMath_OctaveDbStack.dat',dbstack_data);");

        this.dbstackPanel.reload();
        this.dbstackPanel.openFiles();
    }

    private void debugScriptMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_debugScriptMenuItemActionPerformed
        this.openInFlotingWindow(this.debuggerView);
        if (fileTab.getSelectedIndex() >= 0) {
            save();
            File file_selected = new File(fileTab.getToolTipTextAt(fileTab.getSelectedIndex()));
            executeScript(file_selected);

            createStackData();
        }
    }//GEN-LAST:event_debugScriptMenuItemActionPerformed

    private void jMenuItem7ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem7ActionPerformed
        this.openInFlotingWindow(this.debuggerView);
    }//GEN-LAST:event_jMenuItem7ActionPerformed

    private void jMenuItem8ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem8ActionPerformed
        if (fileTab.getSelectedIndex() >= 0) {
            save();
            File file_selected = new File(fileTab.getToolTipTextAt(fileTab.getSelectedIndex()));
            String f = file_selected.getName();
            String config_name = file_selected.getName().substring(0, f.lastIndexOf(".")) + ".rcfg";
            File cfg = new File(file_selected.getParent() + File.separator + config_name);
            // executeScript(file_selected);
            ScriptRunConfigDialog scriptRunConfigDialog = new ScriptRunConfigDialog(this, true, cfg, file_selected);
            scriptRunConfigDialog.setLocationRelativeTo(this);
            scriptRunConfigDialog.setVisible(true);

        }
    }//GEN-LAST:event_jMenuItem8ActionPerformed

    private void jMenuItem9ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem9ActionPerformed
        MainFrame.octavePanel.evaluate("pkg load all;");
        String f = System.getProperty("user.dir") + File.separator + "cache" + File.separator + "pkg_list.xml";
        MainFrame.octavePanel.evaluate("DomainMath_PkgContents('" + f + "');");

        PkgDocFrame pkgDocFrame = new PkgDocFrame(this);
        pkgDocFrame.setLocationRelativeTo(this);
        this.setCursor(new Cursor(Cursor.WAIT_CURSOR));

        ActionListener taskPerformer = (ActionEvent evt1) -> {
            pkgDocFrame.setVisible(true);
        };
        javax.swing.Timer t = new javax.swing.Timer(1200, taskPerformer);
        t.setRepeats(false);
        t.start();
        this.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
    }//GEN-LAST:event_jMenuItem9ActionPerformed

    private void checkForUpdatesMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkForUpdatesMenuItemActionPerformed
        new ModuleLoader().load(this, true);
    }//GEN-LAST:event_checkForUpdatesMenuItemActionPerformed

    private void runScriptCItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_runScriptCItemActionPerformed
        if (fileTab.getSelectedIndex() >= 0) {
            save();
            File file_selected = new File(fileTab.getToolTipTextAt(fileTab.getSelectedIndex()));
            runFile2(file_selected.toPath());

        }
    }//GEN-LAST:event_runScriptCItemActionPerformed

    public static void main(String args[]) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException
                | UnsupportedLookAndFeelException ex) {
        }
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new MainFrame(null).setVisible(true);

            }
        });
    }

    public java.net.URL imgURL = getClass().getResource("/org/domainmath/gui/resources/DomainMath.png");
    public Image icon = Toolkit.getDefaultToolkit().getImage(imgURL);
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JMenuItem AboutItem;
    private javax.swing.JButton addButton;
    private javax.swing.JMenuItem arrayEditItem;
    private javax.swing.JButton browseButton;
    private javax.swing.ButtonGroup buttonGroup1;
    private javax.swing.JMenuItem checkForUpdatesMenuItem;
    private javax.swing.JMenuItem clearAllBreakpointsItem;
    private javax.swing.JMenuItem clearOutWindowItem;
    private javax.swing.JMenuItem closeAllItem;
    private javax.swing.JMenuItem closeItem;
    private javax.swing.JMenuItem codeEditorItem;
    private javax.swing.JButton connectButton;
    private javax.swing.JMenuItem connectItem;
    private javax.swing.JMenuItem consoleItem;
    private javax.swing.JMenuItem continueItem;
    private javax.swing.JMenuItem copyItem;
    private javax.swing.JMenuItem cutItem;
    private javax.swing.JMenu debugMenu;
    private javax.swing.JMenuItem debugScriptMenuItem;
    private javax.swing.JMenuItem deleteItem;
    public static javax.swing.JComboBox dirComboBox;
    private javax.swing.JButton disconnectButton;
    private javax.swing.JMenuItem disconnectItem;
    private javax.swing.JMenuItem docPkgItem;
    private javax.swing.JMenu editMenu;
    private javax.swing.JMenuItem exitItem;
    private javax.swing.JMenuItem faqItem;
    private javax.swing.JMenuItem feedBackItem;
    private javax.swing.JMenu fileMenu;
    private javax.swing.JMenuItem filesItem;
    private javax.swing.JMenuItem findItem;
    private javax.swing.JMenuItem finishDebugItem;
    private javax.swing.JMenuItem fltkplotItem;
    private javax.swing.JButton folderUpButton;
    private javax.swing.JMenuItem forumItem;
    private javax.swing.JMenuItem googleItem;
    private javax.swing.JMenuItem gotoItem;
    private javax.swing.JMenu helpMenu;
    private javax.swing.JMenuItem historyItem;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;
    private javax.swing.JButton jButton4;
    private javax.swing.JButton jButton5;
    private javax.swing.JButton jButton6;
    private javax.swing.JButton jButton7;
    private javax.swing.JButton jButton8;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenu jMenu2;
    private javax.swing.JMenu jMenu3;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenuItem jMenuItem1;
    private javax.swing.JMenuItem jMenuItem2;
    private javax.swing.JMenuItem jMenuItem3;
    private javax.swing.JMenuItem jMenuItem4;
    private javax.swing.JMenuItem jMenuItem5;
    private javax.swing.JMenuItem jMenuItem6;
    private javax.swing.JMenuItem jMenuItem7;
    private javax.swing.JMenuItem jMenuItem8;
    private javax.swing.JMenuItem jMenuItem9;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPopupMenu.Separator jSeparator1;
    private javax.swing.JPopupMenu.Separator jSeparator10;
    private javax.swing.JPopupMenu.Separator jSeparator11;
    private javax.swing.JPopupMenu.Separator jSeparator12;
    private javax.swing.JToolBar.Separator jSeparator13;
    private javax.swing.JPopupMenu.Separator jSeparator14;
    private javax.swing.JToolBar.Separator jSeparator15;
    private javax.swing.JPopupMenu.Separator jSeparator17;
    private javax.swing.JPopupMenu.Separator jSeparator18;
    private javax.swing.JPopupMenu.Separator jSeparator19;
    private javax.swing.JPopupMenu.Separator jSeparator2;
    private javax.swing.JPopupMenu.Separator jSeparator20;
    private javax.swing.JPopupMenu.Separator jSeparator21;
    private javax.swing.JPopupMenu.Separator jSeparator22;
    private javax.swing.JPopupMenu.Separator jSeparator23;
    private javax.swing.JPopupMenu.Separator jSeparator24;
    private javax.swing.JPopupMenu.Separator jSeparator25;
    private javax.swing.JPopupMenu.Separator jSeparator29;
    private javax.swing.JPopupMenu.Separator jSeparator3;
    private javax.swing.JToolBar.Separator jSeparator4;
    private javax.swing.JPopupMenu.Separator jSeparator5;
    private javax.swing.JPopupMenu.Separator jSeparator6;
    private javax.swing.JPopupMenu.Separator jSeparator7;
    private javax.swing.JPopupMenu.Separator jSeparator8;
    private javax.swing.JToolBar.Separator jSeparator9;
    private javax.swing.JToolBar jToolBar1;
    private javax.swing.JMenuItem newFileItem;
    private javax.swing.JMenuItem nextWindowItem;
    private javax.swing.JMenuItem octaveCmdItem;
    private javax.swing.JMenuItem octaveInfoItem;
    private javax.swing.JMenuItem onlineHelpItem;
    private javax.swing.JMenuItem openItem;
    private javax.swing.JMenuItem pasteItem;
    private javax.swing.JMenuItem pathsItem;
    private javax.swing.JMenu pkgMenu;
    private javax.swing.JMenuItem pkgsItem;
    private javax.swing.JMenuItem preferencesItem;
    private javax.swing.JMenuItem previousWindowItem;
    private javax.swing.JMenuItem printFileItem;
    private javax.swing.JMenuItem printItem;
    private javax.swing.JMenuItem quickHelpItem;
    private javax.swing.JMenuItem redoItem;
    private javax.swing.JMenuItem referenceItem;
    private javax.swing.JMenu referenceMenu;
    private javax.swing.JMenuItem removeToggleBreakpointItem;
    private javax.swing.JMenuItem replaceItem;
    private javax.swing.JMenuItem reportBugItem;
    private javax.swing.JMenuItem runScriptCItem;
    private javax.swing.JMenuItem runScriptItem;
    private javax.swing.JMenuItem saveAllItem;
    private javax.swing.JMenuItem saveAsItem;
    private javax.swing.JMenuItem saveFileItem;
    private javax.swing.JMenuItem savePlotItem;
    private javax.swing.JMenuItem selectAllItem;
    private javax.swing.JMenuItem stepInItem;
    private javax.swing.JMenuItem stepItem;
    private javax.swing.JMenuItem stepOutItem;
    private javax.swing.JMenuItem testScriptMenuItem;
    private javax.swing.JMenuItem toggleBreakpointItem;
    private javax.swing.JMenu toolsMenu;
    private javax.swing.JMenuItem undoItem;
    private javax.swing.JMenuItem wikiItem;
    private javax.swing.JMenuItem windowsItem;
    private javax.swing.JMenuItem workspaceItem;
    // End of variables declaration//GEN-END:variables

    private static class DynamicView extends View {
        private int id;

        /**
         * Constructor.
         *
         * @param title     the view title
         * @param icon      the view icon
         * @param component the view component
         * @param id        the view id
         */
        DynamicView(String title, Icon icon, Component component, int id) {
            super(title, icon, component);
            this.id = id;
        }

        /**
         * Returns the view id.
         *
         * @return the view id
         */
        public int getId() {
            return id;
        }
    }
}