//////////////////////////////////////////////////////////////////////////////// // checkstyle: Checks Java source code for adherence to a set of rules. // Copyright (C) 2001-2017 the original author or authors. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA //////////////////////////////////////////////////////////////////////////////// package com.puppycrawl.tools.checkstyle.gui; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.io.File; import javax.swing.AbstractAction; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTextArea; import javax.swing.SwingConstants; import javax.swing.filechooser.FileFilter; import com.puppycrawl.tools.checkstyle.api.CheckstyleException; import com.puppycrawl.tools.checkstyle.gui.MainFrameModel.ParseMode; /** * Displays information about a parse tree. * The user can change the file that is parsed and displayed * using a JFileChooser. * * @author Lars Kühne * @author Vladislav Lisetskiy */ public class MainFrame extends JFrame { private static final long serialVersionUID = 7970053543351871890L; /** Checkstyle frame model. */ private final transient MainFrameModel model = new MainFrameModel(); /** Reload action. */ private final ReloadAction reloadAction = new ReloadAction(); /** Code text area. */ private JTextArea textArea; /** Tree table. */ private TreeTable treeTable; /** Create a new MainFrame. */ public MainFrame() { createContent(); } /** Create content of this MainFrame. */ private void createContent() { setLayout(new BorderLayout()); textArea = new JTextArea(20, 15); textArea.setEditable(false); final JScrollPane textAreaScrollPane = new JScrollPane(textArea); treeTable = new TreeTable(model.getParseTreeTableModel()); treeTable.setEditor(textArea); treeTable.setLinePositionMap(model.getLinesToPosition()); final JScrollPane treeTableScrollPane = new JScrollPane(treeTable); final JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, treeTableScrollPane, textAreaScrollPane); add(splitPane, BorderLayout.CENTER); splitPane.setResizeWeight(0.7); add(createButtonsPanel(), BorderLayout.PAGE_END); pack(); } /** * Create buttons panel. * @return buttons panel. */ private JPanel createButtonsPanel() { final JButton openFileButton = new JButton(new FileSelectionAction()); openFileButton.setMnemonic(KeyEvent.VK_S); openFileButton.setText("Open File"); reloadAction.setEnabled(false); final JButton reloadFileButton = new JButton(reloadAction); reloadFileButton.setMnemonic(KeyEvent.VK_R); reloadFileButton.setText("Reload File"); final JComboBox<ParseMode> modesCombobox = new JComboBox<>(ParseMode.values()); modesCombobox.setSelectedIndex(0); modesCombobox.addActionListener(e -> { model.setParseMode((ParseMode) modesCombobox.getSelectedItem()); reloadAction.actionPerformed(null); }); final JLabel modesLabel = new JLabel("Modes:", SwingConstants.RIGHT); final int leftIndentation = 10; modesLabel.setBorder(BorderFactory.createEmptyBorder(0, leftIndentation, 0, 0)); final JPanel buttonPanel = new JPanel(); buttonPanel.setLayout(new GridLayout(1, 2)); buttonPanel.add(openFileButton); buttonPanel.add(reloadFileButton); final JPanel modesPanel = new JPanel(); modesPanel.add(modesLabel); modesPanel.add(modesCombobox); final JPanel mainPanel = new JPanel(); mainPanel.setLayout(new BorderLayout()); mainPanel.add(buttonPanel); mainPanel.add(modesPanel, BorderLayout.LINE_END); return mainPanel; } /** * Open file and load it. * @param sourceFile the file to open. */ public void openFile(File sourceFile) { try { model.openFile(sourceFile); setTitle(model.getTitle()); reloadAction.setEnabled(model.isReloadActionEnabled()); textArea.setText(model.getText()); treeTable.setLinePositionMap(model.getLinesToPosition()); } catch (final CheckstyleException ex) { JOptionPane.showMessageDialog(this, ex.getMessage()); } } /** * Handler for file selection action events. */ private class FileSelectionAction extends AbstractAction { private static final long serialVersionUID = 1762396148873280589L; @Override public void actionPerformed(ActionEvent event) { final JFileChooser fileChooser = new JFileChooser(model.getLastDirectory()); final FileFilter filter = new JavaFileFilter(); fileChooser.setFileFilter(filter); final int returnCode = fileChooser.showOpenDialog(MainFrame.this); if (returnCode == JFileChooser.APPROVE_OPTION) { final File file = fileChooser.getSelectedFile(); openFile(file); } } } /** * Handler for reload action events. */ private class ReloadAction extends AbstractAction { private static final long serialVersionUID = -890320994114628011L; @Override public void actionPerformed(ActionEvent event) { openFile(model.getCurrentFile()); } } /** * Filter for Java files. */ private static class JavaFileFilter extends FileFilter { @Override public boolean accept(File file) { return MainFrameModel.shouldAcceptFile(file); } @Override public String getDescription() { return "Java Source File"; } } }