• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

jiangxincode / ApkToolBoxGUI / #1161

06 Sep 2025 01:12AM UTC coverage: 2.956% (-0.03%) from 2.985%
#1161

push

jiangxincode
Merge branch 'master' of https://github.com/jiangxincode/ApkToolBoxGUI

248 of 8389 relevant lines covered (2.96%)

0.03 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/main/java/edu/jiangxin/apktoolbox/swing/extend/filepanel/FilePanel.java
1
package edu.jiangxin.apktoolbox.swing.extend.filepanel;
2

3
import edu.jiangxin.apktoolbox.utils.Constants;
4
import edu.jiangxin.apktoolbox.utils.FileUtils;
5
import org.apache.commons.lang3.ArrayUtils;
6
import org.apache.commons.lang3.StringUtils;
7
import org.apache.logging.log4j.LogManager;
8
import org.apache.logging.log4j.Logger;
9

10
import javax.swing.*;
11
import javax.swing.filechooser.FileNameExtensionFilter;
12
import java.awt.*;
13
import java.awt.datatransfer.DataFlavor;
14
import java.awt.datatransfer.Transferable;
15
import java.awt.datatransfer.UnsupportedFlavorException;
16
import java.awt.event.ActionEvent;
17
import java.awt.event.ActionListener;
18
import java.io.File;
19
import java.io.IOException;
20
import java.util.List;
21

22
public class FilePanel extends JPanel {
23
    private static final Logger LOGGER = LogManager.getLogger(FilePanel.class.getSimpleName());
×
24
    private JTextField fileTextField;
25

26
    private String buttonText;
27

28
    private String currentDirectoryPath = ".";
×
29

30
    private int fileSelectionMode = JFileChooser.FILES_ONLY;
×
31

32
    private String description;
33

34
    private String[] extensions;
35

36
    private JFileChooser fileChooser;
37

38
    private IFileReadyCallback callback;
39

40
    public FilePanel(String buttonText) {
41
        super();
×
42
        fileChooser = new JFileChooser();
×
43
        this.buttonText = buttonText;
×
44
        initUI();
×
45
    }
×
46

47
    public void setCurrentDirectoryPath(String currentDirectoryPath) {
48
        this.currentDirectoryPath = currentDirectoryPath;
×
49
    }
×
50

51
    public void setFileReadyCallback(IFileReadyCallback callback) {
52
        this.callback = callback;
×
53
    }
×
54

55
    public void setFileSelectionMode(int fileSelectionMode) {
56
        this.fileSelectionMode = fileSelectionMode;
×
57
    }
×
58

59
    public void setDescriptionAndFileExtensions(String description, String[] extensions) {
60
        this.description = description;
×
61
        this.extensions = extensions;
×
62
        if (StringUtils.isNotEmpty(description) || (ArrayUtils.isNotEmpty(extensions))) {
×
63
            FileNameExtensionFilter filter = new FileNameExtensionFilter(description, extensions);
×
64
            if (fileChooser != null) {
×
65
                fileChooser.resetChoosableFileFilters();
×
66
                fileChooser.addChoosableFileFilter(filter);
×
67
                fileChooser.setAcceptAllFileFilterUsed(false);
×
68
            }
69
        } else {
×
70
            if (fileChooser != null) {
×
71
                fileChooser.resetChoosableFileFilters();
×
72
                fileChooser.setAcceptAllFileFilterUsed(true);
×
73
            }
74
        }
75
    }
×
76

77
    private void initUI() {
78
        setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
×
79

80
        fileTextField = new JTextField();
×
81
        fileTextField.setName(Constants.KEY_PREFIX + "FilePanel.TextField");
×
82
        fileTextField.setPreferredSize(new Dimension(600, 30));
×
83
        fileTextField.setMaximumSize(new Dimension(1200, 30));
×
84
        fileTextField.setTransferHandler(new FileTransferHandler());
×
85

86
        JButton chooseButton = new JButton(buttonText);
×
87
        chooseButton.addActionListener(new OpenDictionaryFileActionListener());
×
88

89
        add(fileTextField);
×
90
        add(Box.createHorizontalStrut(Constants.DEFAULT_X_BORDER));
×
91
        add(chooseButton);
×
92
    }
×
93

94
    public File getFile() {
95
        return new File(fileTextField.getText());
×
96
    }
97

98
    class OpenDictionaryFileActionListener implements ActionListener {
×
99
        @Override
100
        public void actionPerformed(ActionEvent e) {
101
            fileChooser.setCurrentDirectory(new File(currentDirectoryPath));
×
102
            fileChooser.setFileSelectionMode(fileSelectionMode);
×
103
            fileChooser.setMultiSelectionEnabled(false);
×
104
            if (StringUtils.isNotEmpty(description) || (ArrayUtils.isNotEmpty(extensions))) {
×
105
                FileNameExtensionFilter filter = new FileNameExtensionFilter(description, extensions);
×
106
                fileChooser.addChoosableFileFilter(filter);
×
107
                fileChooser.setAcceptAllFileFilterUsed(false);
×
108
            } else {
×
109
                fileChooser.resetChoosableFileFilters();
×
110
                fileChooser.setAcceptAllFileFilterUsed(true);
×
111
            }
112
            int returnVal = fileChooser.showOpenDialog(FilePanel.this);
×
113
            if (returnVal == JFileChooser.APPROVE_OPTION) {
×
114
                File selectedFile = fileChooser.getSelectedFile();
×
115
                fileTextField.setText(FileUtils.getCanonicalPathQuiet(selectedFile));
×
116
                if (callback != null) {
×
117
                    callback.onFileReady(selectedFile);
×
118
                }
119
            }
120
        }
×
121
    }
122

123
    class FileTransferHandler extends TransferHandler {
124
        public FileTransferHandler() {
×
125
        }
×
126

127
        @Override
128
        public boolean importData(JComponent comp, Transferable t) {
129
            List<File> files = null;
×
130
            try {
131
                files = (List<File>) t.getTransferData(DataFlavor.javaFileListFlavor);
×
132
            } catch (IOException e) {
×
133
                LOGGER.error("importData failed: IOException");
×
134
            } catch (UnsupportedFlavorException e) {
×
135
                LOGGER.error("importData failed: UnsupportedFlavorException");
×
136
            }
×
137
            if (files == null || files.size() != 1) {
×
138
                LOGGER.error("importData failed: getTransferData failed");
×
139
                return false;
×
140
            }
141
            File file = files.get(0);
×
142
            if ((!file.isFile() && fileSelectionMode == JFileChooser.FILES_ONLY)
×
143
                    ||(!file.isDirectory() && fileSelectionMode == JFileChooser.DIRECTORIES_ONLY)) {
×
144
                LOGGER.error("importData failed: fileSelectionMode is not match");
×
145
                return false;
×
146
            }
147
            fileTextField.setText(FileUtils.getCanonicalPathQuiet(file));
×
148
            if (callback != null) {
×
149
                callback.onFileReady(file);
×
150
            }
151
            return true;
×
152
        }
153

154
        @Override
155
        public boolean canImport(JComponent jComponent, DataFlavor[] dataFlavors) {
156
            for (DataFlavor dataFlavor : dataFlavors) {
×
157
                if (DataFlavor.javaFileListFlavor.equals(dataFlavor)) {
×
158
                    return true;
×
159
                }
160
            }
161
            return false;
×
162
        }
163
    }
164
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc