/*
* Copyright (C) 2014 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.pathsview;
import java.awt.Component;
import java.awt.Desktop;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URI;
import java.nio.file.Paths;
import java.util.StringTokenizer;
import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.ListCellRenderer;
import javax.swing.SwingWorker;
import javax.swing.filechooser.FileSystemView;
import org.domainmath.gui.MainFrame;
import org.domainmath.gui.dialog.Msg;
/**
*
* @author Auto Test
*/
public class PathsPanel extends javax.swing.JPanel {
private DefaultListModel model;
private final String dataFile;
/**
* Creates new form PathsPanel
* @param dataFile
*/
public PathsPanel(String dataFile) {
initComponents();
model =new DefaultListModel();
this.dataFile=dataFile;
setPaths(dataFile);
this.pathsList.setCellRenderer(new PathsCellRenderer());
this.pathsList.setModel(model);
setPopMenu();
}
public final void setPaths(String datafile) {
String line;
try {
FileInputStream fin = new FileInputStream(datafile);
BufferedReader br = new BufferedReader(new InputStreamReader(fin));
try {
while((line=br.readLine()) != null) {
StringTokenizer s2 = new StringTokenizer(line,File.pathSeparator);
while(s2.hasMoreTokens()) {
model.addElement(s2.nextToken());
}
}
br.close();
} catch (IOException ex) {
}
} catch (FileNotFoundException ex) {
}
}
private void showPopup(MouseEvent e){
if(e.isPopupTrigger()) {
this.jPopupMenu1.show(e.getComponent(), e.getX(), e.getY());
}
}
public void addFolder() {
JFileChooser fc = new JFileChooser();
fc.setCurrentDirectory(new File(System.getProperty("user.dir")+File.separator+"works"));
fc.setMultiSelectionEnabled(true);
fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int returnVal = fc.showOpenDialog(this);
File selected_dir[];
String cmdAddPath;
String savePath;
if (returnVal == JFileChooser.APPROVE_OPTION) {
selected_dir = fc.getSelectedFiles();
for(int i=0; i<selected_dir.length; i++) {
int showConfirmDialog = JOptionPane.showConfirmDialog(this,"Do you want to add subfolders?","Add Subfolders",JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE);
if(showConfirmDialog== JOptionPane.YES_OPTION) {
cmdAddPath = "addpath(genpath("+"'"+selected_dir[i].getAbsolutePath()+"'));";
savePath = "savepath();";
MainFrame.octavePanel.evaluate(cmdAddPath);
MainFrame.octavePanel.evaluate(savePath);
MainFrame.octavePanel.evaluate("DomainMath_OctavePaths('"+dataFile+"');");
reload();
}else{
cmdAddPath = "addpath("+"'"+selected_dir[i].getAbsolutePath()+"');";
savePath = "savepath();";
MainFrame.octavePanel.evaluate(cmdAddPath);
MainFrame.octavePanel.evaluate(savePath);
MainFrame.octavePanel.evaluate("DomainMath_OctavePaths('"+dataFile+"');");
reload();
}
}
}
}
public void reload() {
new DataTask().execute();
}
public void open(String dir) {
try {
URI uri = Paths.get(dir).toUri();
Desktop desktop=Desktop.getDesktop();
desktop.browse(uri);
} catch (IOException | NullPointerException ex) {
}
}
public void remove(String dir){
try {
if(!dir.equals("")){
if(!dir.equals(".")){
String rmPath ="rmpath("+"'"+dir+"');";
String savePath = "savepath();";
MainFrame.octavePanel.evaluate(rmPath);
MainFrame.octavePanel.evaluate(savePath);
MainFrame.octavePanel.evaluate("DomainMath_OctavePaths('"+dataFile+"');");
reload();
}
}else{
new Msg(null,"Please choose a path...");
}
}catch(Exception ex) {
new Msg(null,"Please choose a path...");
}
}
/**
* 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() {
jPopupMenu1 = new javax.swing.JPopupMenu();
openItem = new javax.swing.JMenuItem();
addFolderItem = new javax.swing.JMenuItem();
removeFolderItem = new javax.swing.JMenuItem();
refreshItem = new javax.swing.JMenuItem();
jPanel1 = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
pathsList = new javax.swing.JList();
jToolBar1 = new javax.swing.JToolBar();
openButton = new javax.swing.JButton();
addFolderButton = new javax.swing.JButton();
removeFolderButton = new javax.swing.JButton();
refreshButton = new javax.swing.JButton();
openItem.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/domainmath/gui/pathsview/resources/folder_16.png"))); // NOI18N
openItem.setText("Open");
openItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
openItemActionPerformed(evt);
}
});
jPopupMenu1.add(openItem);
addFolderItem.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/domainmath/gui/pathsview/resources/folder_add_16.png"))); // NOI18N
addFolderItem.setText("Add Folder");
addFolderItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
addFolderItemActionPerformed(evt);
}
});
jPopupMenu1.add(addFolderItem);
removeFolderItem.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/domainmath/gui/pathsview/resources/folder_delete_16.png"))); // NOI18N
removeFolderItem.setText("Remove");
removeFolderItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
removeFolderItemActionPerformed(evt);
}
});
jPopupMenu1.add(removeFolderItem);
refreshItem.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/domainmath/gui/pathsview/resources/view-refresh-7.png"))); // NOI18N
refreshItem.setText("Refresh");
refreshItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
refreshItemActionPerformed(evt);
}
});
jPopupMenu1.add(refreshItem);
setBackground(new java.awt.Color(0, 153, 0));
setLayout(new java.awt.BorderLayout());
jPanel1.setLayout(new java.awt.BorderLayout());
jScrollPane1.setBorder(null);
jScrollPane1.setViewportView(pathsList);
jPanel1.add(jScrollPane1, java.awt.BorderLayout.CENTER);
jToolBar1.setFloatable(false);
jToolBar1.setOrientation(javax.swing.SwingConstants.VERTICAL);
jToolBar1.setRollover(true);
openButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/domainmath/gui/pathsview/resources/folder_16.png"))); // NOI18N
openButton.setToolTipText("Open selected folder");
openButton.setFocusable(false);
openButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
openButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
openButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
openButtonActionPerformed(evt);
}
});
jToolBar1.add(openButton);
addFolderButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/domainmath/gui/pathsview/resources/folder_add_16.png"))); // NOI18N
addFolderButton.setToolTipText("Add a folder");
addFolderButton.setFocusable(false);
addFolderButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
addFolderButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
addFolderButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
addFolderButtonActionPerformed(evt);
}
});
jToolBar1.add(addFolderButton);
removeFolderButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/domainmath/gui/pathsview/resources/folder_delete_16.png"))); // NOI18N
removeFolderButton.setToolTipText("Reomve path");
removeFolderButton.setFocusable(false);
removeFolderButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
removeFolderButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
removeFolderButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
removeFolderButtonActionPerformed(evt);
}
});
jToolBar1.add(removeFolderButton);
refreshButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/domainmath/gui/pathsview/resources/view-refresh-7.png"))); // NOI18N
refreshButton.setToolTipText("Reload paths list");
refreshButton.setFocusable(false);
refreshButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
refreshButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
refreshButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
refreshButtonActionPerformed(evt);
}
});
jToolBar1.add(refreshButton);
jPanel1.add(jToolBar1, java.awt.BorderLayout.LINE_START);
add(jPanel1, java.awt.BorderLayout.CENTER);
}// </editor-fold>//GEN-END:initComponents
private void openButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_openButtonActionPerformed
if(pathsList.getSelectedIndex()!= -1) {
open(pathsList.getSelectedValue().toString());
}
}//GEN-LAST:event_openButtonActionPerformed
private void addFolderButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addFolderButtonActionPerformed
addFolder();
}//GEN-LAST:event_addFolderButtonActionPerformed
private void removeFolderButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removeFolderButtonActionPerformed
if(pathsList.getSelectedIndex()!= -1) {
int showConfirmDialog = JOptionPane.showConfirmDialog(this, "Do you want remove selected paths?","Remove Path" ,JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
if(showConfirmDialog==JOptionPane.YES_OPTION) {
int[] selectedIndices = pathsList.getSelectedIndices();
for(int i:selectedIndices) {
remove(model.getElementAt(i).toString());
}
}
}
}//GEN-LAST:event_removeFolderButtonActionPerformed
private void refreshButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_refreshButtonActionPerformed
reload();
}//GEN-LAST:event_refreshButtonActionPerformed
private void openItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_openItemActionPerformed
if(pathsList.getSelectedIndex()!= -1) {
open(pathsList.getSelectedValue().toString());
}
}//GEN-LAST:event_openItemActionPerformed
private void addFolderItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addFolderItemActionPerformed
addFolder();
}//GEN-LAST:event_addFolderItemActionPerformed
private void removeFolderItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removeFolderItemActionPerformed
if(pathsList.getSelectedIndex()!= -1) {
int showConfirmDialog = JOptionPane.showConfirmDialog(this, "Do you want remove selected paths?","Remove Path" ,JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
if(showConfirmDialog==JOptionPane.YES_OPTION) {
int[] selectedIndices = pathsList.getSelectedIndices();
for(int i:selectedIndices) {
remove(model.getElementAt(i).toString());
}
}
}
}//GEN-LAST:event_removeFolderItemActionPerformed
private void refreshItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_refreshItemActionPerformed
reload();
}//GEN-LAST:event_refreshItemActionPerformed
private void setPopMenu() {
this.pathsList.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
showPopup(e);
}
@Override
public void mouseReleased(MouseEvent e) {
showPopup(e);
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
});
}
class PathsCellRenderer extends JLabel implements ListCellRenderer {
public PathsCellRenderer() {
setOpaque(true);
}
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
FileSystemView fsv = FileSystemView.getFileSystemView();
setText(value.toString());
setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/domainmath/gui/pathsview/resources/folder_16.png")));
if (isSelected) {
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
} else {
setBackground(list.getBackground());
setForeground(list.getForeground());
}
return this;
}
} //PathsCellRenderer
private class DataTask extends SwingWorker<Void, Void> {
@Override
protected Void doInBackground() {
int delay = 1000; //milliseconds
ActionListener taskPerformer = new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
model.removeAllElements();
setPaths(dataFile);
}
};
javax.swing.Timer t= new javax.swing.Timer(delay, taskPerformer);
t.setRepeats(false);
t.start();
return null;
}
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton addFolderButton;
private javax.swing.JMenuItem addFolderItem;
private javax.swing.JPanel jPanel1;
private javax.swing.JPopupMenu jPopupMenu1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JToolBar jToolBar1;
private javax.swing.JButton openButton;
private javax.swing.JMenuItem openItem;
private javax.swing.JList pathsList;
private javax.swing.JButton refreshButton;
private javax.swing.JMenuItem refreshItem;
private javax.swing.JButton removeFolderButton;
private javax.swing.JMenuItem removeFolderItem;
// End of variables declaration//GEN-END:variables
} //PathsPanel