Search in sources :

Example 16 with IFSFile

use of com.ibm.as400.access.IFSFile in project IBMiProgTool by vzupka.

the class CreateAndDeleteInIBMi method deleteSourcePhysicalFile.

/**
 * Delete Source Physical File.
 */
protected void deleteSourcePhysicalFile() {
    // First, show initial message "deleting . . ."
    extractNamesFromIfsPath(ifsFile.toString());
    try {
        // Delete all members and the file
        if (ifsFile.isSourcePhysicalFile()) {
            // Get list of members
            IFSFile[] ifsFiles = ifsFile.listFiles();
            for (IFSFile member : ifsFiles) {
                extractNamesFromIfsPath(member.toString());
                // Delete member
                member.delete();
                row = "Info: Source physical file member " + libraryName + "/" + fileName + "(" + memberName + ")  was deleted.";
                mainWindow.msgVector.add(row);
                mainWindow.showMessages();
            }
            // Finally delete the directory (members' parent)
            extractNamesFromIfsPath(ifsFile.toString());
            // Delete source file
            ifsFile.delete();
            row = "Comp: Source physical file  " + libraryName + "/" + fileName + "  was deleted.";
            mainWindow.msgVector.add(row);
            mainWindow.showMessages();
        // PARENT NODE of deleted node will be reloaded and the deleted node will disappear from the tree.
        // Get parent path string
        // mainWindow.rightPathString = mainWindow.rightPathString.substring(0, mainWindow.rightPathString.lastIndexOf("/"));
        // Get parent node
        // mainWindow.rightNode = (DefaultMutableTreeNode) mainWindow.rightNode.getParent();
        // mainWindow.showMessages();
        }
    } catch (Exception exc) {
        exc.printStackTrace();
        row = "Error: Source physical file  " + ifsFile.toString() + " - " + exc.toString() + ".";
        mainWindow.msgVector.add(row);
        mainWindow.showMessages();
    }
}
Also used : IFSFile(com.ibm.as400.access.IFSFile)

Example 17 with IFSFile

use of com.ibm.as400.access.IFSFile in project IBMiProgTool by vzupka.

the class DisplayFile method displayIfsFile.

/**
 * Display contents of the IFS file using its CCSID attribute
 *
 * @param remoteServer
 * @param ifsFilePathString
 */
protected void displayIfsFile(AS400 remoteServer, String ifsFilePathString) {
    this.setTitle("Display IFS file  '" + ifsFilePathString + "'");
    // The user can correct the parameter "IBMi CCSID" and try again.
    try {
        IFSFile ifsFile = new IFSFile(remoteServer, ifsFilePathString);
        int attributeCCSID = ifsFile.getCCSID();
        characterSetLabel.setText("CCSID " + attributeCCSID + " was used for display.");
        byte[] inputBuffer = new byte[100000];
        byte[] workBuffer = new byte[100000];
        try (IFSFileInputStream inputStream = new IFSFileInputStream(remoteServer, ifsFilePathString)) {
            int bytesRead = inputStream.read(inputBuffer);
            while (bytesRead != -1) {
                for (int idx = 0; idx < bytesRead; idx++) {
                    // Copy input byte to output byte
                    workBuffer[idx] = inputBuffer[idx];
                }
                // Copy the printable part of the work array to a new buffer that will be written out.
                byte[] bufferToWrite = new byte[bytesRead];
                // Copy bytes from the work buffer to the new buffer
                for (int indx = 0; indx < bytesRead; indx++) {
                    bufferToWrite[indx] = workBuffer[indx];
                }
                // Create object for conversion from bytes to characters
                AS400Text textConverter = new AS400Text(bytesRead, attributeCCSID, remoteServer);
                // Convert byte array buffer to text line
                String textLine = (String) textConverter.toObject(bufferToWrite);
                // Append the line to text area
                textArea.append(textLine + NEW_LINE);
                // Read next input buffer
                bytesRead = inputStream.read(inputBuffer);
            }
            // Set scroll bar to top
            textArea.setCaretPosition(0);
            // Display the window.
            setVisible(true);
            row = "Info: IFS file  " + ifsFilePathString + "  has CCSID  " + attributeCCSID + ".";
            mainWindow.msgVector.add(row);
            mainWindow.showMessages(nodes);
        }
    } catch (Exception exc) {
        exc.printStackTrace();
        row = "Error: " + exc.toString();
        mainWindow.msgVector.add(row);
        mainWindow.showMessages(nodes);
    }
    // Remove message scroll listener (cancel scrolling to the last message)
    mainWindow.scrollMessagePane.getVerticalScrollBar().removeAdjustmentListener(mainWindow.messageScrollPaneAdjustmentListenerMax);
}
Also used : AS400Text(com.ibm.as400.access.AS400Text) Point(java.awt.Point) PatternSyntaxException(java.util.regex.PatternSyntaxException) BadLocationException(javax.swing.text.BadLocationException) UnsupportedCharsetException(java.nio.charset.UnsupportedCharsetException) IllegalCharsetNameException(java.nio.charset.IllegalCharsetNameException) IFSFile(com.ibm.as400.access.IFSFile) IFSFileInputStream(com.ibm.as400.access.IFSFileInputStream)

Example 18 with IFSFile

use of com.ibm.as400.access.IFSFile in project IBMiProgTool by vzupka.

the class EditFile method displayIfsFile.

/**
 * Display contents of the IFS file using its CCSID attribute.
 */
protected void displayIfsFile() {
    this.setTitle("Edit IFS file  '" + filePathString + "'");
    // Correct the parameter "IBMi CCSID".
    try {
        IFSFile ifsFile = new IFSFile(remoteServer, filePathString);
        ccsidAttribute = ifsFile.getCCSID();
        characterSetLabel.setText("CCSID " + ccsidAttribute + " was used for display.");
        byte[] inputBuffer = new byte[100000];
        byte[] workBuffer = new byte[100000];
        textArea.setText("");
        try (IFSFileInputStream inputStream = new IFSFileInputStream(remoteServer, filePathString)) {
            int bytesRead = inputStream.read(inputBuffer);
            while (bytesRead != -1) {
                for (int idx = 0; idx < bytesRead; idx++) {
                    // Copy input byte to output byte
                    workBuffer[idx] = inputBuffer[idx];
                }
                // Copy the printable part of the work array
                // to a new buffer that will be written out.
                byte[] bufferToWrite = new byte[bytesRead];
                // Copy bytes from the work buffer to the new buffer
                for (int indx = 0; indx < bytesRead; indx++) {
                    bufferToWrite[indx] = workBuffer[indx];
                }
                // Create object for conversion from bytes to characters
                AS400Text textConverter = new AS400Text(bytesRead, ccsidAttribute, remoteServer);
                // Convert byte array buffer to text line
                String textLine = (String) textConverter.toObject(bufferToWrite);
                // Append the line to text area
                textArea.append(textLine + NEW_LINE);
                // Read next input buffer
                bytesRead = inputStream.read(inputBuffer);
            }
        }
    } catch (Exception exc) {
        isError = true;
        row = "Error in displaying IFS file: " + exc.toString();
        mainWindow.msgVector.add(row);
        mainWindow.showMessages(nodes);
    }
    // Remove message scroll listener (cancel scrolling to the last message)
    mainWindow.scrollMessagePane.getVerticalScrollBar().removeAdjustmentListener(mainWindow.messageScrollPaneAdjustmentListenerMax);
}
Also used : AS400Text(com.ibm.as400.access.AS400Text) Point(java.awt.Point) CannotUndoException(javax.swing.undo.CannotUndoException) CannotRedoException(javax.swing.undo.CannotRedoException) BadLocationException(javax.swing.text.BadLocationException) IFSFile(com.ibm.as400.access.IFSFile) IFSFileInputStream(com.ibm.as400.access.IFSFileInputStream)

Example 19 with IFSFile

use of com.ibm.as400.access.IFSFile in project IBMiProgTool by vzupka.

the class EditFile method rewriteSourceMember.

/**
 * Rewrite source member with edited text area using an intermediate temporary IFS file; This method is fast enough.
 *
 * @return
 */
protected String rewriteSourceMember() {
    // Extract individual names (libraryName, fileName, memberName) from the AS400 IFS path
    extractNamesFromIfsPath(filePathString);
    // Path to the output source member
    String outMemberPathString = "/QSYS.LIB/" + libraryName + ".LIB/" + fileName + ".FILE" + "/" + memberName + ".MBR";
    // Enable calling CL commands
    CommandCall cmdCall = new CommandCall(remoteServer);
    IFSFileOutputStream outStream = null;
    try {
        // ------------------------------------
        if (!properties.getProperty("OVERWRITE_FILE").equals("Y")) {
            row = "Info: Member  " + libraryName + "/" + fileName + "(" + memberName + ")   cannot be overwtitten. " + " Overwriting files is not allowed.";
            mainWindow.msgVector.add(row);
            mainWindow.showMessages();
            return "ERROR";
        }
        // Overwrite is allowed
        // --------------------
        // First create an IFS '/home/userName directory if it does not exist
        String home_userName = "/home/" + userName;
        IFSFile ifsDir = new IFSFile(remoteServer, home_userName);
        // Create new directory if it does not exist
        ifsDir.mkdir();
        // Create hidden temporary file (with leading dot) in the directory
        String tmpFileString = home_userName + "/.tmp" + Timestamp.valueOf(LocalDateTime.now()).toString();
        IFSFile ifsTmpFile = new IFSFile(remoteServer, tmpFileString);
        IFSFile ifsTmpFilePath = new IFSFile(remoteServer, tmpFileString);
        ifsTmpFile.createNewFile();
        // Force the memeber CCSID to the IFS file as an attribute
        ifsTmpFilePath.setCCSID(ibmCcsidInt);
        // Copy edited text area to the temporary IFS file
        outStream = new IFSFileOutputStream(remoteServer, tmpFileString);
        String textAreaString = textArea.getText();
        byte[] byteArray;
        AS400Text textConverter = new AS400Text(textAreaString.length(), ibmCcsidInt);
        byteArray = textConverter.toBytes(textAreaString);
        // Write text from the text area to the file
        outStream.write(byteArray);
        // Close file
        outStream.close();
        // Copy data from temporary IFS file to the member. If the member does not exist it is created.
        String commandCpyFrmStmfString = "CPYFRMSTMF FROMSTMF('" + tmpFileString + "') TOMBR('" + outMemberPathString + "') MBROPT(*REPLACE) CVTDTA(*AUTO)";
        // Perform the command
        cmdCall.run(commandCpyFrmStmfString);
        // Get messages from the command if any
        AS400Message[] as400MessageList = cmdCall.getMessageList();
        // return.
        for (AS400Message as400Message : as400MessageList) {
            if (as400Message.getType() == AS400Message.ESCAPE) {
                row = "Error: Copy IFS file  " + tmpFileString + "  to source member  " + tmpFileString + "  using command CPYFRMSTMF  -  " + as400Message.getID() + " " + as400Message.getText();
                mainWindow.msgVector.add(row);
                mainWindow.showMessages();
                return "ERROR";
            } else {
                row = "Info: Copy IFS file  " + tmpFileString + "  to source member  " + tmpFileString + "  using command CPYFRMSTMF  -  " + as400Message.getID() + " " + as400Message.getText();
                mainWindow.msgVector.add(row);
                mainWindow.showMessages();
            }
        }
        // Delete the temporary file
        ifsTmpFile.delete();
        row = "Comp: Source member  " + libraryName + "/" + fileName + "(" + memberName + ")  was saved.";
        mainWindow.msgVector.add(row);
        mainWindow.showMessages();
        return "";
    } catch (Exception exc) {
        try {
            outStream.close();
        } catch (Exception exce) {
            exce.printStackTrace();
        }
        exc.printStackTrace();
        row = "Error: 3 Data cannot be written to the source member  " + libraryName + "/" + fileName + "(" + memberName + ")  -  " + exc.toString();
        mainWindow.msgVector.add(row);
        mainWindow.showMessages();
        // Must not continue in order not to lock an object
        return "ERROR";
    }
}
Also used : CommandCall(com.ibm.as400.access.CommandCall) IFSFileOutputStream(com.ibm.as400.access.IFSFileOutputStream) AS400Text(com.ibm.as400.access.AS400Text) AS400Message(com.ibm.as400.access.AS400Message) CannotUndoException(javax.swing.undo.CannotUndoException) CannotRedoException(javax.swing.undo.CannotRedoException) BadLocationException(javax.swing.text.BadLocationException) IFSFile(com.ibm.as400.access.IFSFile)

Example 20 with IFSFile

use of com.ibm.as400.access.IFSFile in project IBMiProgTool by vzupka.

the class MainWindow method createWindow.

/**
 * Create window containing trees with initial files in upper part; Left tree
 * shows local file system; Right tree shows IBM i file system (IFS).
 */
public void createWindow() {
    cont = getContentPane();
    globalPanel = new JPanel();
    globalPanelLayout = new GroupLayout(globalPanel);
    menuBar = new JMenuBar();
    helpMenu = new JMenu("Help");
    helpMenuItemEN = new JMenuItem("Help English");
    helpMenuItemCZ = new JMenuItem("Nápověda česky");
    helpMenuItemRPGIII = new JMenuItem("RPG III forms");
    helpMenuItemRPGIV = new JMenuItem("RPG IV forms");
    helpMenuItemCOBOL = new JMenuItem("COBOL form");
    helpMenuItemDDS = new JMenuItem("DDS forms");
    helpMenu.add(helpMenuItemEN);
    helpMenu.add(helpMenuItemCZ);
    helpMenu.add(helpMenuItemRPGIII);
    helpMenu.add(helpMenuItemRPGIV);
    helpMenu.add(helpMenuItemCOBOL);
    helpMenu.add(helpMenuItemDDS);
    menuBar.add(helpMenu);
    // In macOS on the main system menu bar above, in Windows on the window menu bar
    setJMenuBar(menuBar);
    panelTop = new JPanel();
    panelTopLayout = new GroupLayout(panelTop);
    panelTop.setLayout(panelTopLayout);
    panelPathLeft = new JPanel();
    panelPathLeft.setLayout(new BoxLayout(panelPathLeft, BoxLayout.LINE_AXIS));
    scrollPaneLeft = new JScrollPane();
    scrollPaneLeft.setBorder(BorderFactory.createEmptyBorder());
    panelPathRight = new JPanel();
    panelPathRight.setLayout(new BoxLayout(panelPathRight, BoxLayout.LINE_AXIS));
    scrollPaneRight = new JScrollPane();
    scrollPaneRight.setBorder(BorderFactory.createEmptyBorder());
    // Windows: Disks combo box is included in order to choose proper root
    // directory (A:\, C:\, ...)
    Component diskLabelWin;
    Component disksComboBoxWin;
    if (operatingSystem.equals(WINDOWS)) {
        diskLabelWin = disksLabel;
        disksComboBoxWin = disksComboBox;
    } else {
        // 
        // Unix (Mac): Empty component instead of combo box
        diskLabelWin = new JLabel("");
        disksComboBoxWin = new JLabel("");
    }
    disksComboBox.setToolTipText("List of root directories.");
    // Lay out components in panelTop
    panelTopLayout.setAutoCreateGaps(false);
    panelTopLayout.setAutoCreateContainerGaps(false);
    panelTopLayout.setHorizontalGroup(panelTopLayout.createParallelGroup(Alignment.LEADING).addGroup(panelTopLayout.createSequentialGroup().addComponent(userNameLabel).addComponent(userNameTextField).addComponent(hostLabel).addComponent(hostTextField).addComponent(connectReconnectButton).addGap(5).addComponent(libraryPatternLabel).addComponent(libraryPatternTextField).addGap(5).addComponent(filePatternLabel).addComponent(filePatternTextField).addGap(5).addComponent(memberPatternLabel).addComponent(memberPatternTextField).addGap(5).addComponent(sourceTypeLabel).addComponent(sourceTypeComboBox)).addGroup(panelTopLayout.createSequentialGroup().addComponent(pcCharsetLabel).addComponent(pcCharComboBox).addComponent(ibmCcsidLabel).addComponent(ibmCcsidComboBox).addComponent(sourceRecordLengthLabel).addComponent(sourceRecordLengthTextField).addComponent(sourceRecordPrefixLabel).addComponent(sourceRecordPrefixCheckBox).addComponent(overwriteOutputFileLabel).addComponent(overwriteOutputFileCheckBox).addComponent(diskLabelWin).addComponent(disksComboBoxWin)));
    panelTopLayout.setVerticalGroup(panelTopLayout.createSequentialGroup().addGroup(panelTopLayout.createParallelGroup(Alignment.CENTER).addComponent(userNameLabel).addComponent(userNameTextField).addComponent(hostLabel).addComponent(hostTextField).addComponent(connectReconnectButton).addGap(5).addComponent(libraryPatternLabel).addComponent(libraryPatternTextField).addGap(5).addComponent(filePatternLabel).addComponent(filePatternTextField).addGap(5).addComponent(memberPatternLabel).addComponent(memberPatternTextField).addGap(5).addComponent(sourceTypeLabel).addComponent(sourceTypeComboBox)).addGroup(panelTopLayout.createParallelGroup(Alignment.CENTER).addComponent(pcCharsetLabel).addComponent(pcCharComboBox).addComponent(ibmCcsidLabel).addComponent(ibmCcsidComboBox).addComponent(sourceRecordLengthLabel).addComponent(sourceRecordLengthTextField).addComponent(sourceRecordPrefixLabel).addComponent(sourceRecordPrefixCheckBox).addComponent(overwriteOutputFileLabel).addComponent(overwriteOutputFileCheckBox).addComponent(diskLabelWin).addComponent(disksComboBoxWin)));
    panelTop.setLayout(panelTopLayout);
    panelPathLeft.add(leftPathLabel);
    leftPathComboBox.setEditable(true);
    panelPathLeft.add(leftPathComboBox);
    panelPathRight.add(rightPathLabel);
    rightPathComboBox.setEditable(true);
    panelPathRight.add(rightPathComboBox);
    panelLeft = new JPanel();
    panelLeft.setLayout(new BorderLayout());
    panelLeft.add(panelPathLeft, BorderLayout.NORTH);
    panelLeft.add(scrollPaneLeft, BorderLayout.CENTER);
    panelRight = new JPanel();
    panelRight.setLayout(new BorderLayout());
    panelRight.add(panelPathRight, BorderLayout.NORTH);
    panelRight.add(scrollPaneRight, BorderLayout.CENTER);
    // Split pane inner - divided by horizontal divider
    splitPaneInner = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
    splitPaneInner.setLeftComponent(panelLeft);
    splitPaneInner.setRightComponent(panelRight);
    splitPaneInner.setDividerSize(6);
    splitPaneInner.setBorder(BorderFactory.createEmptyBorder());
    // Scroll pane for message list
    scrollMessagePane.setBorder(BorderFactory.createEmptyBorder());
    // Split pane outer - divided by vertical divider
    splitPaneOuter = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
    splitPaneOuter.setTopComponent(splitPaneInner);
    splitPaneOuter.setBottomComponent(scrollMessagePane);
    splitPaneOuter.setDividerSize(6);
    splitPaneOuter.setBorder(BorderFactory.createEmptyBorder());
    // This listener keeps the scroll pane at the LAST MESSAGE.
    messageScrollPaneAdjustmentListenerMax = new MessageScrollPaneAdjustmentListenerMax();
    // List of messages for placing into message scroll pane
    messageList = new JList<String>();
    // Decision what color the message will get
    messageList.setCellRenderer(new DefaultListCellRenderer() {

        @Override
        public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
            Component component = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
            if (value.toString().startsWith("Comp")) {
                this.setForeground(DIM_BLUE);
            } else if (value.toString().startsWith("Err")) {
                this.setForeground(DIM_RED);
            } else if (value.toString().startsWith("Info")) {
                this.setForeground(Color.GRAY);
            } else if (value.toString().startsWith("Wait")) {
                this.setForeground(DIM_PINK);
            } else {
                this.setForeground(Color.BLACK);
            }
            return component;
        }
    });
    // Build messageTable and put it to scrollMessagePane and panelMessages
    buildMessageList();
    // Create left tree showing local file system
    // ----------------
    leftRoot = properties.getProperty("LEFT_PATH");
    // ----------------------------------------------
    // Create new left side
    // ----------------------------------------------
    // Create split panes containing the PC file tree on the left side of the window
    createNewLeftSide(leftRoot);
    // Lay out the window components using GroupLayout
    // -----------------------------
    globalPanelLayout.setAutoCreateGaps(false);
    globalPanelLayout.setAutoCreateContainerGaps(false);
    globalPanelLayout.setHorizontalGroup(globalPanelLayout.createSequentialGroup().addGroup(globalPanelLayout.createParallelGroup().addComponent(panelTop).addComponent(splitPaneOuter)));
    globalPanelLayout.setVerticalGroup(globalPanelLayout.createParallelGroup().addGroup(globalPanelLayout.createSequentialGroup().addComponent(panelTop).addComponent(splitPaneOuter)));
    // Create a global panel to wrap the layout
    globalPanel.setLayout(globalPanelLayout);
    // Set border to the global panel - before it is visible
    globalPanel.setBorder(BorderFactory.createLineBorder(globalPanel.getBackground(), borderWidth));
    // When the split pane is visible - can divide it by percentage
    // 50 %
    double splitPaneInnerDividerLoc = 0.50d;
    // Percentage to reveal the first message line height when the scroll pane is full
    double splitPaneOuterDividerLoc = 0.835d;
    splitPaneInner.setDividerLocation(splitPaneInnerDividerLoc);
    splitPaneOuter.setDividerLocation(splitPaneOuterDividerLoc);
    // Stabilize vertical divider always in the middle
    splitPaneInner.setResizeWeight(0.5);
    // Register WindowListener for storing X and Y coordinates to properties
    addWindowListener(new MainWindowAdapter());
    // Register HelpWindow menu item listener
    helpMenuItemEN.addActionListener(ae -> {
        String command = ae.getActionCommand();
        if (command.equals("Help English")) {
            if (Desktop.isDesktopSupported()) {
                String uri = Paths.get(System.getProperty("user.dir"), "helpfiles", "IBMiProgTool_doc_EN.pdf").toString();
                // Replace backslashes by forward slashes in Windows
                uri = uri.replace('\\', '/');
                uri = uri.replace(" ", "%20");
                try {
                    // Invoke the standard browser in the operating system
                    Desktop.getDesktop().browse(new URI("file://" + uri));
                } catch (Exception exc) {
                    exc.printStackTrace();
                }
            }
        }
    });
    // Register HelpWindow menu item listener
    helpMenuItemCZ.addActionListener(ae -> {
        String command = ae.getActionCommand();
        if (command.equals("Nápověda česky")) {
            if (Desktop.isDesktopSupported()) {
                String uri = Paths.get(System.getProperty("user.dir"), "helpfiles", "IBMiProgTool_doc_CZ.pdf").toString();
                // Replace backslashes by forward slashes in Windows
                uri = uri.replace('\\', '/');
                uri = uri.replace(" ", "%20");
                try {
                    // Invoke the standard browser in the operating system
                    Desktop.getDesktop().browse(new URI("file://" + uri));
                } catch (Exception exc) {
                    exc.printStackTrace();
                }
            }
        }
    });
    // Register HelpWindow menu item listener
    helpMenuItemRPGIII.addActionListener(ae -> {
        String command = ae.getActionCommand();
        if (command.equals("RPG III forms")) {
            if (Desktop.isDesktopSupported()) {
                String uri = Paths.get(System.getProperty("user.dir"), "helpfiles", "RPG_III_forms.pdf").toString();
                // Replace backslashes by forward slashes in Windows
                uri = uri.replace('\\', '/');
                try {
                    // Invoke the standard browser in the operating system
                    Desktop.getDesktop().browse(new URI("file://" + uri));
                } catch (Exception exc) {
                    exc.printStackTrace();
                }
            }
        }
    });
    // Register HelpWindow menu item listener
    helpMenuItemRPGIV.addActionListener(ae -> {
        String command = ae.getActionCommand();
        if (command.equals("RPG IV forms")) {
            if (Desktop.isDesktopSupported()) {
                String uri = Paths.get(System.getProperty("user.dir"), "helpfiles", "RPG_IV_forms.pdf").toString();
                // Replace backslashes by forward slashes in Windows
                uri = uri.replace('\\', '/');
                uri = uri.replace(" ", "%20");
                try {
                    // Invoke the standard browser in the operating system
                    Desktop.getDesktop().browse(new URI("file://" + uri));
                } catch (Exception exc) {
                    exc.printStackTrace();
                }
            }
        }
    });
    // Register HelpWindow menu item listener
    helpMenuItemCOBOL.addActionListener(ae -> {
        String command = ae.getActionCommand();
        if (command.equals("COBOL form")) {
            if (Desktop.isDesktopSupported()) {
                String uri = Paths.get(System.getProperty("user.dir"), "helpfiles", "COBOL_form.pdf").toString();
                // Replace backslashes by forward slashes in Windows
                uri = uri.replace('\\', '/');
                uri = uri.replace(" ", "%20");
                try {
                    // Invoke the standard browser in the operating system
                    Desktop.getDesktop().browse(new URI("file://" + uri));
                } catch (Exception exc) {
                    exc.printStackTrace();
                }
            }
        }
    });
    // Register HelpWindow menu item listener
    helpMenuItemDDS.addActionListener(ae -> {
        String command = ae.getActionCommand();
        if (command.equals("DDS forms")) {
            if (Desktop.isDesktopSupported()) {
                String uri = Paths.get(System.getProperty("user.dir"), "helpfiles", "DDS_forms.pdf").toString();
                // Replace backslashes by forward slashes in Windows
                uri = uri.replace('\\', '/');
                uri = uri.replace(" ", "%20");
                try {
                    // Invoke the standard browser in the operating system
                    Desktop.getDesktop().browse(new URI("file://" + uri));
                } catch (Exception exc) {
                    exc.printStackTrace();
                }
            }
        }
    });
    // Set left path string as selected in the left combo box
    leftPathComboBox.setSelectedItem(leftPathString);
    // Set also right path string in the right combo box
    rightPathComboBox.setSelectedItem(rightPathString);
    // 
    // User name text field action
    // ---------------------------
    userNameTextField.addActionListener(ae -> {
        userNameTextField.setText(userNameTextField.getText().toUpperCase());
        // Create the updated text file in directory "paramfiles"
        try {
            infile = Files.newBufferedReader(parPath, Charset.forName(encoding));
            properties.load(infile);
            infile.close();
            properties.setProperty("USERNAME", userNameTextField.getText());
            outfile = Files.newBufferedWriter(parPath, Charset.forName(encoding));
            properties.store(outfile, PROP_COMMENT);
            outfile.close();
            refreshWindow();
        } catch (Exception exc) {
            exc.printStackTrace();
        }
    });
    // 
    // Host text field action
    // ----------------------
    hostTextField.addActionListener(ae -> {
        hostTextField.setText(hostTextField.getText());
        // Connect or reconnect the server
        connectReconnectRefresh();
    });
    // 
    // Source Type combo box item listener
    // ---------------------
    sourceTypeComboBox.addItemListener(il -> {
        // JComboBox<String> source = new
        // JComboBox<String>((String[])il.getSource());
        JComboBox<String[]> source = (JComboBox) il.getSource();
        sourceType = (String) source.getSelectedItem();
        // Create the updated text file in directory "paramfiles"
        try {
            infile = Files.newBufferedReader(parPath, Charset.forName(encoding));
            properties.load(infile);
            infile.close();
            properties.setProperty("SOURCE_TYPE", sourceType);
            outfile = Files.newBufferedWriter(parPath, Charset.forName(encoding));
            properties.store(outfile, PROP_COMMENT);
            outfile.close();
        } catch (Exception exc) {
            exc.printStackTrace();
        }
    });
    // 
    // Library pattern text field action
    // -------------------------
    libraryPatternTextField.addActionListener(ae -> {
        libraryPatternTextField.setText(libraryPatternTextField.getText().toUpperCase());
        // Create the updated text file in directory "paramfiles"
        try {
            infile = Files.newBufferedReader(parPath, Charset.forName(encoding));
            properties.load(infile);
            infile.close();
            properties.setProperty("LIBRARY_PATTERN", libraryPatternTextField.getText());
            outfile = Files.newBufferedWriter(parPath, Charset.forName(encoding));
            properties.store(outfile, PROP_COMMENT);
            outfile.close();
            connectReconnectRefresh();
        } catch (Exception exc) {
            exc.printStackTrace();
        }
    });
    // 
    // Source file pattern text field action
    // ------------------------------------
    filePatternTextField.addActionListener(ae -> {
        filePatternTextField.setText(filePatternTextField.getText().toUpperCase());
        // Create the updated text file in directory "paramfiles"
        try {
            infile = Files.newBufferedReader(parPath, Charset.forName(encoding));
            properties.load(infile);
            infile.close();
            properties.setProperty("FILE_PATTERN", filePatternTextField.getText());
            outfile = Files.newBufferedWriter(parPath, Charset.forName(encoding));
            properties.store(outfile, PROP_COMMENT);
            outfile.close();
            connectReconnectRefresh();
        } catch (Exception exc) {
            exc.printStackTrace();
        }
    });
    // 
    // Member pattern text field action
    // -------------------------------
    memberPatternTextField.addActionListener(ae -> {
        memberPatternTextField.setText(memberPatternTextField.getText().toUpperCase());
        // Create the updated text file in directory "paramfiles"
        try {
            infile = Files.newBufferedReader(parPath, Charset.forName(encoding));
            properties.load(infile);
            infile.close();
            properties.setProperty("MEMBER_PATTERN", memberPatternTextField.getText());
            outfile = Files.newBufferedWriter(parPath, Charset.forName(encoding));
            properties.store(outfile, PROP_COMMENT);
            outfile.close();
            connectReconnectRefresh();
        } catch (Exception exc) {
            exc.printStackTrace();
        }
    });
    // 
    // Source record length text field action
    // --------------------------------------
    sourceRecordLengthTextField.addActionListener(ae -> {
        String srcRecLen = sourceRecordLengthTextField.getText();
        try {
            Integer.parseInt(srcRecLen);
        } catch (NumberFormatException nfe) {
            // If the user enters non-integer text, take default value
            srcRecLen = "80";
        }
        sourceRecordLengthTextField.setText(srcRecLen);
        // Create the updated text file in directory "paramfiles"
        try {
            infile = Files.newBufferedReader(parPath, Charset.forName(encoding));
            properties.load(infile);
            infile.close();
            outfile = Files.newBufferedWriter(parPath, Charset.forName(encoding));
            properties.setProperty("SOURCE_RECORD_LENGTH", srcRecLen);
            properties.store(outfile, PROP_COMMENT);
            outfile.close();
        } catch (Exception exc) {
            exc.printStackTrace();
        }
    });
    // 
    // Connect/Reconnect button action
    // -------------------------------
    connectReconnectButton.addActionListener(ae -> {
        connectReconnectRefresh();
    });
    // 
    // PC charset combo box
    // --------------------
    // Select charset name from the list in combo box - listener
    pcCharComboBox.addItemListener(il -> {
        JComboBox source = (JComboBox) il.getSource();
        pcCharset = (String) source.getSelectedItem();
        if (!pcCharset.equals("*DEFAULT")) {
            // Check if charset is valid
            try {
                Charset.forName(pcCharset);
            } catch (IllegalCharsetNameException | UnsupportedCharsetException charset) {
                // If pcCharset is invalid, take ISO-8859-1
                pcCharset = "ISO-8859-1";
                pcCharComboBox.setSelectedItem(pcCharset);
            }
        }
        // Create the updated text file in directory "paramfiles"
        try {
            infile = Files.newBufferedReader(parPath, Charset.forName(encoding));
            properties.load(infile);
            infile.close();
            properties.setProperty("PC_CHARSET", pcCharset);
            outfile = Files.newBufferedWriter(parPath, Charset.forName(encoding));
            properties.store(outfile, PROP_COMMENT);
            outfile.close();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    });
    // 
    // IBM i CCSID combo box item listener
    // ---------------------
    ibmCcsidComboBox.addItemListener(il -> {
        JComboBox source = (JComboBox) il.getSource();
        ibmCcsid = (String) source.getSelectedItem();
        if (!ibmCcsid.equals("*DEFAULT")) {
            try {
                ibmCcsidInt = Integer.parseInt(ibmCcsid);
            } catch (Exception exc) {
                exc.printStackTrace();
                ibmCcsid = "37";
                ibmCcsidInt = 37;
                ibmCcsidComboBox.setSelectedItem(ibmCcsid);
            }
        }
        // Create the updated text file in directory "paramfiles"
        try {
            infile = Files.newBufferedReader(parPath, Charset.forName(encoding));
            properties.load(infile);
            infile.close();
            outfile = Files.newBufferedWriter(parPath, Charset.forName(encoding));
            properties.setProperty("IBM_CCSID", ibmCcsid);
            properties.store(outfile, PROP_COMMENT);
            outfile.close();
        } catch (Exception exc) {
            exc.printStackTrace();
        }
    });
    // 
    // Source record pattern check box - Yes = "Y", No = ""
    // ---------------------------------------------------
    sourceRecordPrefixCheckBox.addItemListener(il -> {
        Object source = il.getSource();
        if (source == sourceRecordPrefixCheckBox) {
            String check;
            if (sourceRecordPrefixCheckBox.isSelected()) {
                check = "Y";
            } else {
                check = "";
            }
            // Create the updated text file in directory "paramfiles"
            try {
                infile = Files.newBufferedReader(parPath, Charset.forName(encoding));
                properties.load(infile);
                infile.close();
                outfile = Files.newBufferedWriter(parPath, Charset.forName(encoding));
                properties.setProperty("SOURCE_RECORD_PREFIX", check);
                properties.store(outfile, PROP_COMMENT);
                outfile.close();
            } catch (Exception exc) {
                exc.printStackTrace();
            }
        }
    });
    // 
    // Overwrite output file(s) check box - Yes = "Y", No = ""
    // -------------------------------------------------------
    overwriteOutputFileCheckBox.addItemListener(il -> {
        Object source = il.getSource();
        if (source == overwriteOutputFileCheckBox) {
            String check;
            if (overwriteOutputFileCheckBox.isSelected()) {
                check = "Y";
            } else {
                check = "";
            }
            // Create the updated text file in directory "paramfiles"
            try {
                infile = Files.newBufferedReader(parPath, Charset.forName(encoding));
                properties.load(infile);
                infile.close();
                outfile = Files.newBufferedWriter(parPath, Charset.forName(encoding));
                properties.setProperty("OVERWRITE_FILE", check);
                properties.store(outfile, PROP_COMMENT);
                outfile.close();
            } catch (Exception exc) {
                exc.printStackTrace();
            }
        }
    });
    // 
    // Left popup menu on Right mouse click
    // ====================================
    // 
    // Find text in multiple PC files
    // 
    findInPcFiles.addActionListener(ae -> {
        copySourceTree = leftTree;
        // Set clipboard path string for find operation
        clipboardPathStrings = leftPathStrings;
        SearchWindow searchWindow = new SearchWindow(remoteServer, this, "PC");
    });
    // 
    // Send to remote server (IBM i)
    // 
    copyFromLeft.addActionListener(ae -> {
        copySourceTree = leftTree;
        // Set clipboard path string for paste operation
        clipboardPathStrings = leftPathStrings;
    });
    // 
    // Receive from remote server (IBM i) or PC itself
    // 
    pasteToLeft.addActionListener(ae -> {
        if (copySourceTree == rightTree) {
            row = "Wait: Copying from IBM i to PC . . .";
            msgVector.add(row);
            showMessages();
            // Paste from IBM i to PC
            ParallelCopy_IBMi_PC parallelCopy_IMBI_PC = new ParallelCopy_IBMi_PC(remoteServer, clipboardPathStrings, leftPathStrings[0], null, this);
            parallelCopy_IMBI_PC.execute();
        } else if (copySourceTree == leftTree) {
            row = "Wait: Copying from PC to PC . . .";
            msgVector.add(row);
            showMessages(nodes);
            // Paste from PC to PC
            ParallelCopy_PC_PC parallelCopy_PC_PC = new ParallelCopy_PC_PC(clipboardPathStrings, leftPathStrings[0], null, this);
            parallelCopy_PC_PC.execute();
        }
    });
    // Insert spooled file that is copied from directory *workfiles* and, renamed,
    // into selected directory *targetPathString*
    insertSpooledFile.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        sourcePathString = Paths.get(System.getProperty("user.dir"), "workfiles", "SpooledFile.txt").toString();
        targetPathString = leftPathStrings[0];
        copyAndRenameFile("SpooledFile.txt");
        reloadLeftSide(nodes);
    });
    // Display PC file
    displayPcFile.addActionListener(ae -> {
        clipboardPathStrings = leftPathStrings;
        // Display all selected files
        for (int idx = 0; idx < clipboardPathStrings.length; idx++) {
            sourcePathString = clipboardPathStrings[idx];
            JTextArea textArea = new JTextArea();
            // This is a way to display a PC file directly from Java:
            DisplayFile dspf = new DisplayFile(textArea, this);
            dspf.displayPcFile(sourcePathString);
        }
    });
    // Edit PC file
    editPcFile.addActionListener(ae -> {
        clipboardPathStrings = leftPathStrings;
        for (int idx = 0; idx < clipboardPathStrings.length; idx++) {
            sourcePathString = clipboardPathStrings[idx];
            JTextArea textArea = new JTextArea();
            JTextArea textArea2 = new JTextArea();
            EditFile edtf = new EditFile(remoteServer, this, textArea, textArea2, leftPathString, "rewritePcFile");
        }
    });
    // Rename PC file
    renamePcFile.addActionListener(ae -> {
        RenamePcObject rnmpf = new RenamePcObject(this, pcFileSep, currentX, currentY);
        rnmpf.renamePcObject(leftPathString);
    });
    // Create PC directory
    createPcDirectory.addActionListener(ae -> {
        clipboardPathStrings = leftPathStrings;
        if (clipboardPathStrings.length > 0) {
            leftPathString = clipboardPathStrings[0];
            CreateAndDeleteInPC cpcd = new CreateAndDeleteInPC(this, "createPcDirectory", currentX, currentY);
            cpcd.createAndDeleteInPC();
            reloadLeftSide(nodes);
        }
    });
    // Create PC file
    createPcFile.addActionListener(ae -> {
        CreateAndDeleteInPC cpcf = new CreateAndDeleteInPC(this, "createPcFile", currentX, currentY);
        cpcf.createAndDeleteInPC();
        reloadLeftSide(nodes);
    });
    // Move PC objects to trash
    movePcObjectToTrash.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        // Move selected objects to trash
        // ------------------------------
        // Set clipboard path strings for paste operation
        clipboardPathStrings = leftPathStrings;
        for (int idx = 0; idx < clipboardPathStrings.length; idx++) {
            // Set path string for the following class
            leftPathString = clipboardPathStrings[idx];
            // Move one object to trash
            CreateAndDeleteInPC dpco = new CreateAndDeleteInPC(this, "movePcObjectToTrash", currentX, currentY);
            dpco.createAndDeleteInPC();
        }
        // Remove selected nodes
        TreePath[] paths = leftTree.getSelectionPaths();
        for (int indx = 0; indx < paths.length; indx++) {
            leftNode = (DefaultMutableTreeNode) (paths[indx].getLastPathComponent());
            leftTreeModel.removeNodeFromParent(leftNode);
        }
    });
    // 
    // Right popup menu on Right mouse click
    // =====================================
    // 
    // Find text in multiple IFS files
    // 
    findInIfsFiles.addActionListener(ae -> {
        copySourceTree = rightTree;
        // Set clipboard path string for find operation
        clipboardPathStrings = rightPathStrings;
        SearchWindow searchWindow = new SearchWindow(remoteServer, this, "IFS");
    });
    // Send to PC or IBM i itself
    copyFromRight.addActionListener(ae -> {
        copySourceTree = rightTree;
        // Set clipboard path string for paste operation
        clipboardPathStrings = rightPathStrings;
    });
    // Receive from PC or IBM i itself
    // -------------------------------
    pasteToRight.addActionListener(ae -> {
        // This listener keeps the scroll pane at the LAST MESSAGE.
        // It is removed at the end of the method of the background task.
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        sourcePathString = clipboardPathString;
        targetPathString = rightPathStrings[0];
        if (copySourceTree == rightTree) {
            // Paste from IBM i to IBM i
            row = "Wait: Copying from IBM i to IBM i . . .";
            msgVector.add(row);
            showMessages();
            ParallelCopy_IBMi_IBMi parallelCopy_IMBI_IBMI = new ParallelCopy_IBMi_IBMi(remoteServer, clipboardPathStrings, targetPathString, null, this);
            parallelCopy_IMBI_IBMI.execute();
        } else if (copySourceTree == leftTree) {
            // Paste from PC to IBM i
            row = "Wait: Copying from PC to IBM i . . .";
            msgVector.add(row);
            showMessages();
            ParallelCopy_PC_IBMi parallelCopy_PC_IBMI = new ParallelCopy_PC_IBMi(remoteServer, clipboardPathStrings, targetPathString, null, this);
            parallelCopy_PC_IBMI.execute();
        }
    });
    // Copy library
    copyLibrary.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        ifsFile = new IFSFile(remoteServer, rightPathString);
        CreateAndDeleteInIBMi crtdlt = new CreateAndDeleteInIBMi(remoteServer, ifsFile, this, "copyLibrary", currentX, currentY);
        crtdlt.createAndDeleteInIBMi(currentX, currentY);
        reloadRightSide();
    });
    // Clear library
    clearLibrary.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        // Set clipboard path strings for paste operation
        clipboardPathStrings = rightPathStrings;
        for (int idx = 0; idx < clipboardPathStrings.length; idx++) {
            rightPathString = clipboardPathStrings[idx];
            ifsFile = new IFSFile(remoteServer, rightPathString);
            // Clear selected libraries
            // ------------------------
            CreateAndDeleteInIBMi crtdlt = new CreateAndDeleteInIBMi(remoteServer, ifsFile, this, "clearLibrary", currentX, currentY);
            crtdlt.createAndDeleteInIBMi(currentX, currentY);
        }
        // Reload nodes of cleared libraries
        TreePath[] paths = rightTree.getSelectionPaths();
        for (int indx = 0; indx < paths.length; indx++) {
            rightNode = (DefaultMutableTreeNode) (paths[indx].getLastPathComponent());
            reloadRightSide();
        }
    });
    // Delete library
    deleteLibrary.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        // Set clipboard path strings for paste operation
        clipboardPathStrings = rightPathStrings;
        for (int idx = 0; idx < clipboardPathStrings.length; idx++) {
            rightPathString = clipboardPathStrings[idx];
            ifsFile = new IFSFile(remoteServer, rightPathString);
            // Delete selected libraries
            // -------------------------
            CreateAndDeleteInIBMi crtdlt = new CreateAndDeleteInIBMi(remoteServer, ifsFile, this, "deleteLibrary", currentX, currentY);
            crtdlt.createAndDeleteInIBMi(currentX, currentY);
        }
        // Remove selected nodes
        TreePath[] paths = rightTree.getSelectionPaths();
        for (int indx = 0; indx < paths.length; indx++) {
            rightNode = (DefaultMutableTreeNode) (paths[indx].getLastPathComponent());
            rightTreeModel.removeNodeFromParent(rightNode);
        }
    });
    // Create IFS directory in a parent directory
    createIfsDirectory.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        ifsFile = new IFSFile(remoteServer, rightPathString);
        CreateAndDeleteInIBMi crtdlt = new CreateAndDeleteInIBMi(remoteServer, ifsFile, this, "createIfsDirectory", currentX, currentY);
        crtdlt.createAndDeleteInIBMi(currentX, currentY);
        reloadRightSide();
    });
    // Create IFS directory in a parent directory
    createIfsFile.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        ifsFile = new IFSFile(remoteServer, rightPathString);
        CreateAndDeleteInIBMi crtdlt = new CreateAndDeleteInIBMi(remoteServer, ifsFile, this, "createIfsFile", currentX, currentY);
        crtdlt.createAndDeleteInIBMi(currentX, currentY);
        reloadRightSide();
    });
    // Create AS400 Source Physical File
    createSourcePhysicalFile.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        ifsFile = new IFSFile(remoteServer, rightPathString);
        CreateAndDeleteInIBMi crtdlt = new CreateAndDeleteInIBMi(remoteServer, ifsFile, this, "createSourcePhysicalFile", currentX, currentY);
        crtdlt.createAndDeleteInIBMi(currentX, currentY);
        reloadRightSide();
    });
    // Create AS400 Source Member
    createSourceMember.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        ifsFile = new IFSFile(remoteServer, rightPathString);
        CreateAndDeleteInIBMi crtdlt = new CreateAndDeleteInIBMi(remoteServer, ifsFile, this, "createSourceMember", currentX, currentY);
        crtdlt.createAndDeleteInIBMi(currentX, currentY);
        reloadRightSide();
    });
    // Create Save File
    createSaveFile.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        ifsFile = new IFSFile(remoteServer, rightPathString);
        CreateAndDeleteInIBMi crtdlt = new CreateAndDeleteInIBMi(remoteServer, ifsFile, this, "createSaveFile", currentX, currentY);
        crtdlt.createAndDeleteInIBMi(currentX, currentY);
        reloadRightSide();
    });
    // Clear Save File
    clearSaveFile.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        ifsFile = new IFSFile(remoteServer, rightPathString);
        CreateAndDeleteInIBMi crtdlt = new CreateAndDeleteInIBMi(remoteServer, ifsFile, this, "clearSaveFile", currentX, currentY);
        crtdlt.createAndDeleteInIBMi(currentX, currentY);
    });
    // Delete IFS object (directory or file)
    deleteIfsObject.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        // Delete selected objects
        // -----------------------
        // Set clipboard path strings for paste operation
        clipboardPathStrings = rightPathStrings;
        for (int idx = 0; idx < clipboardPathStrings.length; idx++) {
            rightPathString = clipboardPathStrings[idx];
            ifsFile = new IFSFile(remoteServer, rightPathString);
            CreateAndDeleteInIBMi crtdlt = new CreateAndDeleteInIBMi(remoteServer, ifsFile, this, "deleteIfsObject", currentX, currentY);
            crtdlt.createAndDeleteInIBMi(currentX, currentY);
        }
        // Remove selected nodes
        TreePath[] paths = rightTree.getSelectionPaths();
        for (int indx = 0; indx < paths.length; indx++) {
            rightNode = (DefaultMutableTreeNode) (paths[indx].getLastPathComponent());
            rightTreeModel.removeNodeFromParent(rightNode);
        }
    });
    // Delete AS400 Source Member
    deleteSourceMember.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        // Set clipboard path strings for paste operation
        clipboardPathStrings = rightPathStrings;
        for (int idx = 0; idx < clipboardPathStrings.length; idx++) {
            rightPathString = clipboardPathStrings[idx];
            ifsFile = new IFSFile(remoteServer, rightPathString);
            // Delete selected objects
            // -----------------------
            CreateAndDeleteInIBMi crtdlt = new CreateAndDeleteInIBMi(remoteServer, ifsFile, this, "deleteSourceMember", currentX, currentY);
            crtdlt.createAndDeleteInIBMi(currentX, currentY);
        }
        // Remove selected nodes
        TreePath[] paths = rightTree.getSelectionPaths();
        for (int indx = 0; indx < paths.length; indx++) {
            rightNode = (DefaultMutableTreeNode) (paths[indx].getLastPathComponent());
            rightTreeModel.removeNodeFromParent(rightNode);
        }
    });
    // Delete AS400 Source Physical File
    deleteSourcePhysicalFile.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        // Set clipboard path strings for paste operation
        clipboardPathStrings = rightPathStrings;
        for (int idx = 0; idx < clipboardPathStrings.length; idx++) {
            rightPathString = clipboardPathStrings[idx];
            ifsFile = new IFSFile(remoteServer, rightPathString);
            // Delete selected objects
            // -----------------------
            CreateAndDeleteInIBMi crtdlt = new CreateAndDeleteInIBMi(remoteServer, ifsFile, this, "deleteSourcePhysicalFile", currentX, currentY);
            crtdlt.createAndDeleteInIBMi(currentX, currentY);
        }
        // Remove selected nodes
        TreePath[] paths = rightTree.getSelectionPaths();
        for (int indx = 0; indx < paths.length; indx++) {
            rightNode = (DefaultMutableTreeNode) (paths[indx].getLastPathComponent());
            rightTreeModel.removeNodeFromParent(rightNode);
        }
    });
    // Delete Save File
    deleteSaveFile.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        // Set clipboard path strings for paste operation
        clipboardPathStrings = rightPathStrings;
        for (int idx = 0; idx < clipboardPathStrings.length; idx++) {
            rightPathString = clipboardPathStrings[idx];
            ifsFile = new IFSFile(remoteServer, rightPathString);
            // Delete selected objects
            // -----------------------
            CreateAndDeleteInIBMi crtdlt = new CreateAndDeleteInIBMi(remoteServer, ifsFile, this, "deleteSaveFile", currentX, currentY);
            crtdlt.createAndDeleteInIBMi(currentX, currentY);
        }
        // Remove selected nodes
        TreePath[] paths = rightTree.getSelectionPaths();
        for (int indx = 0; indx < paths.length; indx++) {
            rightNode = (DefaultMutableTreeNode) (paths[indx].getLastPathComponent());
            rightTreeModel.removeNodeFromParent(rightNode);
        }
    });
    // Work with spooled files
    workWithSpooledFiles.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        String className = this.getClass().getSimpleName();
        // first "false" stands for *ALL users (not *CURRENT user),
        // second "true" stands for "create spooled file table".
        WrkSplFCall wwsp = new WrkSplFCall(remoteServer, this, rightPathString, // not *CURRENT user
        false, currentX, currentY, className, // create spooled file table
        true);
        wwsp.execute();
    });
    // Display IFS file
    displayIfsFile.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        JTextArea textArea = new JTextArea();
        DisplayFile dspf = new DisplayFile(textArea, this);
        dspf.displayIfsFile(remoteServer, rightPathString);
    });
    // Edit IFS file with source types suffix (e.g. .CLLE, .RPGLE, etc.)
    editIfsFile.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        JTextArea textArea = new JTextArea();
        JTextArea textArea2 = new JTextArea();
        EditFile edtf = new EditFile(remoteServer, this, textArea, textArea2, rightPathString, "rewriteIfsFile");
    });
    // Rename IFS file
    renameIfsFile.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        RenameIfsObject rnmifsf = new RenameIfsObject(remoteServer, this, currentX, currentY);
        rnmifsf.renameIfsObject(rightPathString);
    });
    // Compile IFS file
    compileIfsFile.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        if (compile == null) {
            compile = new Compile(remoteServer, this, rightPathString, true);
        }
        // "true" stands for "IFS file" as a source text
        compile.compile(rightPathString, true);
    // compile = null;
    });
    // Display IBM i Source Member
    displaySourceMember.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        JTextArea textArea = new JTextArea();
        DisplayFile dspf = new DisplayFile(textArea, this);
        dspf.displaySourceMember(remoteServer, rightPathString);
    });
    // Edit IBM i Source Member
    editSourceMember.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        JTextArea textArea = new JTextArea();
        JTextArea textArea2 = new JTextArea();
        EditFile edtf = new EditFile(remoteServer, this, textArea, textArea2, rightPathString, "rewriteSourceMember");
    });
    // Compile Source Member
    compileSourceMember.addActionListener(ae -> {
        scrollMessagePane.getVerticalScrollBar().addAdjustmentListener(messageScrollPaneAdjustmentListenerMax);
        if (compile == null) {
            compile = new Compile(remoteServer, this, rightPathString, false);
        }
        // "false" means "IFS file" is NOT a source text
        compile.compile(rightPathString, false);
    // compile = null;
    });
    // 
    // Find text in multiple Source Members
    // 
    findInSourceMembers.addActionListener(ae -> {
        copySourceTree = rightTree;
        // Set clipboard path string for find operation
        clipboardPathStrings = rightPathStrings;
        SearchWindow searchWindow = new SearchWindow(remoteServer, this, "MBR");
    });
    // =================
    if (operatingSystem.equals(WINDOWS)) {
        // Item listener for DISKS ComboBox reacts on item selection with
        // the
        // mouse
        disksComboBox.addItemListener(il -> {
            JComboBox<String> comboBox = (JComboBox) il.getSource();
            leftPathString = (String) comboBox.getSelectedItem();
            // Remove the old and create a new combo box for left path selection
            panelPathLeft.remove(leftPathComboBox);
            leftPathComboBox = new JComboBox<>();
            leftPathComboBox.setEditable(true);
            panelPathLeft.add(leftPathComboBox);
            leftPathComboBox.addItem(leftPathString);
            leftPathComboBox.setSelectedIndex(0);
            // Register a new ActionListener to the new combo box
            leftPathComboBox.addActionListener(leftPathActionListener);
            // Get the first item (disk symbol or file system root) from the
            // combo box and make it leftRoot
            leftRoot = leftPathString;
            // Make the disk symbol also firstLeftRootSymbol
            firstLeftRootSymbol = leftPathString;
            // Clear and set the tree map with leftRoot and row number 0
            leftTreeMap.clear();
            leftTreeMap.put(leftRoot, 0);
            // Create a new tree and table on the left side of the window
            leftRootChanged = true;
            createNewLeftSide(leftPathString);
        });
    }
    // End Windows
    // Processing continues for both Windows and Unix:
    // 
    // Register action listener for LEFT PATH ComboBox reacts on text change
    // in its input field (first time)
    leftPathComboBox.addActionListener(leftPathActionListener);
    // Component listener reacting to WINDOW RESIZING
    ComponentListener resizingListener = new ComponentAdapter() {

        @Override
        public void componentResized(ComponentEvent componentEvent) {
            windowWidth = componentEvent.getComponent().getWidth();
            windowHeight = componentEvent.getComponent().getHeight();
            // 50 %
            double splitPaneInnerDividerLoc = 0.50d;
            // int splitPaneInnerDividerLoc = (windowWidth - (2 * borderWidth + 5)) / 2;
            splitPaneInner.setDividerLocation(splitPaneInnerDividerLoc);
        }
    };
    // Register window resizing listener
    addComponentListener(resizingListener);
    // Add the global panel to the frame, NOT container
    cont.add(globalPanel);
    add(globalPanel);
    // Set initial size and width of the window
    setSize(windowWidth, windowHeight);
    // Set window coordinates from application properties
    setLocation(mainWindowX, mainWindowY);
    // Show the window on the screen
    setVisible(true);
    // Do not pack
    pack();
}
Also used : JPanel(javax.swing.JPanel) ComponentListener(java.awt.event.ComponentListener) JTextArea(javax.swing.JTextArea) BorderLayout(java.awt.BorderLayout) DefaultListCellRenderer(javax.swing.DefaultListCellRenderer) UnsupportedCharsetException(java.nio.charset.UnsupportedCharsetException) ComponentEvent(java.awt.event.ComponentEvent) JSplitPane(javax.swing.JSplitPane) IFSFile(com.ibm.as400.access.IFSFile) BoxLayout(javax.swing.BoxLayout) URI(java.net.URI) IllegalCharsetNameException(java.nio.charset.IllegalCharsetNameException) GroupLayout(javax.swing.GroupLayout) JMenuItem(javax.swing.JMenuItem) Component(java.awt.Component) JComponent(javax.swing.JComponent) ComponentAdapter(java.awt.event.ComponentAdapter) JScrollPane(javax.swing.JScrollPane) JComboBox(javax.swing.JComboBox) JLabel(javax.swing.JLabel) IOException(java.io.IOException) Point(java.awt.Point) UnsupportedCharsetException(java.nio.charset.UnsupportedCharsetException) IllegalCharsetNameException(java.nio.charset.IllegalCharsetNameException) IOException(java.io.IOException) TreePath(javax.swing.tree.TreePath) JMenuBar(javax.swing.JMenuBar) JMenu(javax.swing.JMenu)

Aggregations

IFSFile (com.ibm.as400.access.IFSFile)44 IllegalCharsetNameException (java.nio.charset.IllegalCharsetNameException)14 UnsupportedCharsetException (java.nio.charset.UnsupportedCharsetException)14 AS400Text (com.ibm.as400.access.AS400Text)11 CommandCall (com.ibm.as400.access.CommandCall)9 AS400Message (com.ibm.as400.access.AS400Message)8 Path (java.nio.file.Path)7 AS400FileRecordDescription (com.ibm.as400.access.AS400FileRecordDescription)5 IFSFileInputStream (com.ibm.as400.access.IFSFileInputStream)5 Record (com.ibm.as400.access.Record)5 RecordFormat (com.ibm.as400.access.RecordFormat)5 SequentialFile (com.ibm.as400.access.SequentialFile)5 BadLocationException (javax.swing.text.BadLocationException)5 Point (java.awt.Point)4 PatternSyntaxException (java.util.regex.PatternSyntaxException)4 IFSFileOutputStream (com.ibm.as400.access.IFSFileOutputStream)3 DecimalFormat (java.text.DecimalFormat)3 CannotRedoException (javax.swing.undo.CannotRedoException)3 CannotUndoException (javax.swing.undo.CannotUndoException)3 BufferedWriter (java.io.BufferedWriter)2