/* * Copyright (C) 2012 Sony Mobile Communications AB * * This file is part of ApkAnalyser. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package gui; import java.awt.BorderLayout; import java.awt.Component; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.LayoutManager; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.File; import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; public class PathListPanel extends JPanel { private static final long serialVersionUID = -5965025765910494761L; protected JList list; protected AbstractMainFrame mainFrame; protected JButton addButton; protected JButton editButton; protected JButton removeButton; protected JButton upButton; protected JButton downButton; protected DefaultListModel listModel; protected boolean ordered = false; public PathListPanel(AbstractMainFrame mainFrame) { super(); initGui(mainFrame, false); } /** * @param isDoubleBuffered */ public PathListPanel(AbstractMainFrame mainFrame, boolean orderSignificant) { super(); initGui(mainFrame, orderSignificant); } /** * @param layout */ public PathListPanel(AbstractMainFrame mainFrame, LayoutManager layout) { super(layout); initGui(mainFrame, false); } /** * @param layout * @param isDoubleBuffered */ public PathListPanel(AbstractMainFrame mainFrame, LayoutManager layout, boolean orderSignificant) { super(layout); initGui(mainFrame, orderSignificant); } JPanel selectablePanel = new JPanel(); JCheckBox checkBox = new JCheckBox(); public void initGui(AbstractMainFrame mainFrame, boolean orderSignificant) { this.mainFrame = mainFrame; ordered = orderSignificant; listModel = new DefaultListModel(); list = new JList(); list.setModel(listModel); addButton = new JButton(getAddButtonText()); editButton = new JButton(getEditButtonText()); removeButton = new JButton(getRemoveButtonText()); if (ordered) { upButton = new JButton(getUpButtonText()); downButton = new JButton(getDownButtonText()); upButton.setEnabled(false); downButton.setEnabled(false); } list.addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { int[] s = list.getSelectedIndices(); boolean oneSelected = s != null && s.length == 1; boolean oneOrMoreSelected = s != null && s.length > 0; editButton.setEnabled(oneSelected); removeButton.setEnabled(oneOrMoreSelected); if (ordered) { upButton.setEnabled(oneOrMoreSelected); downButton.setEnabled(oneOrMoreSelected); } } }); checkBox.setBackground(list.getBackground()); selectablePanel.setLayout(new BorderLayout()); selectablePanel.add(checkBox, BorderLayout.WEST); list.setCellRenderer(new DefaultListCellRenderer() { private static final long serialVersionUID = -1659697029079591990L; @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { if (value instanceof Selectable) { Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); checkBox.setSelected(((Selectable) value).isSelected()); selectablePanel.add(c, BorderLayout.CENTER); return selectablePanel; } else { return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); } } }); list.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (SwingUtilities.isLeftMouseButton(e)) { if (e.getClickCount() == 2) { editEntry(); } else { if (e.getX() < checkBox.getWidth()) { toggleSelected(); } } } } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } }); JPanel buttonPanel = new JPanel(); buttonPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); JPanel innerButtonPanel = new JPanel(); innerButtonPanel.setLayout(new GridLayout(ordered ? 6 : 3, 1)); innerButtonPanel.add(addButton); innerButtonPanel.add(editButton); innerButtonPanel.add(removeButton); if (ordered) { innerButtonPanel.add(new JLabel("")); innerButtonPanel.add(upButton); innerButtonPanel.add(downButton); } buttonPanel.add(innerButtonPanel); editButton.setEnabled(false); removeButton.setEnabled(false); setLayout(new BorderLayout()); add(new JScrollPane(list), BorderLayout.CENTER); add(buttonPanel, BorderLayout.EAST); setAddButtonListener(addButton); editButton.addActionListener(getEditActionListener()); setRemoveButtonListener(removeButton); if (ordered) { setUpButtonListener(upButton); setDownButtonListener(downButton); } } public void setPaths(File[] paths) { listModel = new DefaultListModel(); for (int i = 0; i < paths.length; i++) { listModel.addElement(paths[i]); } list.setModel(listModel); } public Object[] getPaths() { return listModel.toArray(); } protected String getAddButtonText() { return "Add..."; } protected String getEditButtonText() { return "Edit"; } protected String getRemoveButtonText() { return "Remove"; } protected String getUpButtonText() { return "Move up"; } protected String getDownButtonText() { return "Move down"; } protected String getFileListTitleText() { return "Add path"; } protected String getFileListButtonText() { return "Add"; } protected String getFilterSuffix() { return ""; } protected String getFilterDescription() { return ""; } protected boolean isFilesOnly() { return false; } protected boolean isDirectoriesOnly() { return false; } protected void addFileToList(File f) { SelectableFile sf = new SelectableFile(f.getAbsolutePath()); sf.setSelected(true); listModel.addElement(sf); } protected void setAddButtonListener(JButton button) { button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { File[] f = mainFrame.selectFiles(getFileListTitleText(), getFileListButtonText(), getFilterSuffix(), getFilterDescription(), isFilesOnly(), isDirectoriesOnly()); if (f != null && f.length > 0) { for (int i = 0; i < f.length; i++) { addFileToList(f[i]); } } } }); } protected ActionListener getEditActionListener() { return new ActionListener() { @Override public void actionPerformed(ActionEvent e) { editEntry(); } }; } protected void editEntry() { int selInd = list.getSelectedIndex(); if (selInd == -1) { return; } File f = (File) listModel.get(selInd); String s = (String) JOptionPane.showInputDialog(mainFrame, "", "Edit path", JOptionPane.NO_OPTION, null, null, f.getAbsoluteFile()); if (s != null) { f = new SelectableFile(s); listModel.set(selInd, f); } } protected void setRemoveButtonListener(JButton button) { button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int[] selectedIndices = null; do { selectedIndices = list.getSelectedIndices(); if (selectedIndices != null && selectedIndices.length > 0) { listModel.remove(selectedIndices[0]); } } while (selectedIndices != null && selectedIndices.length > 0); } }); } protected void setUpButtonListener(JButton button) { button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int[] selectedIndices = list.getSelectedIndices(); if (selectedIndices[0] == 0) { return; } for (int i = 0; i < selectedIndices.length; i++) { int index = selectedIndices[i]; if (index > 0) { Object over = listModel.elementAt(index - 1); Object at = listModel.elementAt(index); listModel.set(index - 1, at); listModel.set(index, over); } selectedIndices[i] = index - 1; } list.setSelectedIndices(selectedIndices); } }); } protected void toggleSelected() { int[] selectedIndices = list.getSelectedIndices(); if (selectedIndices.length != 1) { return; } Object at = listModel.elementAt(selectedIndices[0]); if (at instanceof SelectableFile) { ((SelectableFile) at).setSelected(!((SelectableFile) at).isSelected()); repaint(); } } protected void setDownButtonListener(JButton button) { button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int[] selectedIndices = list.getSelectedIndices(); if (selectedIndices[selectedIndices.length - 1] == listModel.size() - 1) { return; } for (int i = selectedIndices.length - 1; i >= 0; i--) { int index = selectedIndices[i]; if (index < listModel.size() - 1) { Object at = listModel.elementAt(index); Object under = listModel.elementAt(index + 1); listModel.set(index, under); listModel.set(index + 1, at); } selectedIndices[i] = index + 1; } list.setSelectedIndices(selectedIndices); } }); } }