CaRMtl/eric/JSprogram/JScriptsLeftPanel.java
2018-09-04 22:51:42 -04:00

253 lines
7.2 KiB
Java

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package eric.JSprogram;
import eric.GUI.themes;
import eric.GUI.window.myJMenuItem;
import eric.JEricPanel;
import eric.JZirkelCanvas;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
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.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.ToolTipManager;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreePath;
import rene.gui.Global;
/**
*
* @author PM
*/
public class JScriptsLeftPanel extends JEricPanel {
private String path, SP = System.getProperty("file.separator");
private File ScriptsDirectory = new File(Global.getHomeDirectory()+"scripts");
private DefaultMutableTreeNode myRoot;
private JTree ScriptsTree = null;
private ArrayList<String> ToolTip = new ArrayList<String>(), FileName = new ArrayList<String>();
private ScriptItemsArray items=new ScriptItemsArray();
private JScrollPane jsp;
public JScriptsLeftPanel(){
this.setLayout(new javax.swing.BoxLayout(this, javax.swing.BoxLayout.Y_AXIS));
myRoot = new DefaultMutableTreeNode("CaRScripts");
explore(ScriptsDirectory, myRoot);
ScriptsTree = new JTree(myRoot);
ToolTipManager.sharedInstance().registerComponent(ScriptsTree);
ScriptsTree.setCellRenderer(new MyRenderer());
MouseListener ml = new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
int row = ScriptsTree.getRowForLocation(e.getX(), e.getY());
TreePath TPath = ScriptsTree.getPathForLocation(e.getX(), e.getY());
ScriptsTree.setSelectionRow(row);
if(row != -1 && e.isMetaDown()) {
path = Global.getHomeDirectory()+"scripts";
for(int i=1; i<TPath.getPathCount(); i++){
path += SP;
path += TPath.getPathComponent(i);
}
myPopUpMenu(path, e);
}
}
};
ScriptsTree.addMouseListener(ml);
jsp = new JScrollPane(ScriptsTree);
jsp.setBorder(javax.swing.BorderFactory.createEmptyBorder());
this.add(jsp);
}
public void fixPanelSize(final int w, final int h) {
Dimension d = new Dimension(w, h);
this.setMaximumSize(d);
this.setMinimumSize(d);
this.setPreferredSize(d);
this.setSize(d);
jsp.setSize(d);
jsp.revalidate();
}
class MyRenderer extends DefaultTreeCellRenderer {
private int j;
public MyRenderer() {
}
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded,
boolean leaf, int row, boolean hasFocus) {
super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
if(row !=-1){
if (leaf) {
for(j=0; j<FileName.size() && !FileName.get(j).equals(value.toString()); j++){}
if(j<ToolTip.size()){
setToolTipText(ToolTip.get(j));
}
} else {
setToolTipText(null);
}
}
return this;
}
}
final public void explore(File folder, DefaultMutableTreeNode myRoot){
File[] f = folder.listFiles();
ToolTip.add("");
FileName.add("Folder");
for(File file :f){
DefaultMutableTreeNode childNode;
if(file.isDirectory() && file.listFiles().length!=0){
childNode = new DefaultMutableTreeNode(file.toString().substring(file.toString().lastIndexOf(SP)+1));
myRoot.add(childNode);
explore(file, childNode);
} else if(file.toString().endsWith(".js")) {
childNode = new DefaultMutableTreeNode(file.toString().substring(file.toString().lastIndexOf(SP)+1));
myRoot.add(childNode);
ToolTip.add(getToolTip(file, childNode.toString()));
FileName.add(childNode.toString());
}
}
}
final String getToolTip(File file, String ScriptName){
String str="";
String mystr="<html><b>"+ScriptName+"</b><br/>";
try {
InputStream input = new FileInputStream(file);
BufferedReader in = new BufferedReader(new InputStreamReader(input, "UTF-8"));
while((str=in.readLine())!=null && !(str=str.trim()).endsWith("//end")) {
//str=str.trim();
mystr += str.replace("//", "");
mystr += "<br/>";
}
} catch(Exception ex){}
return mystr+"</html>";
}
/*
* menu popup et les méthodes attachées
* aux différents items
*/
private void myPopUpMenu(final String path, final MouseEvent e){
JMenuItem item, runitem, includeFileItem, includeFolderItem;
JPopupMenu myPopUpMenu = new JPopupMenu();
// add Cancel Item :
item = new myJMenuItem(Global.Loc("JSmenu.cancel"), themes.resizeExistingIcon("/eric/GUI/icons/jswindow/restore.png", 16, 16));
item.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent event) {
JZirkelCanvas.getCurrentZC().getScriptsPanel().Restore();
}
});
item.setEnabled(JZirkelCanvas.getCurrentZC().getScriptsPanel().isBackup());
myPopUpMenu.add(item);
// add Run Item
runitem = new myJMenuItem("Exécuter", themes.resizeExistingIcon("/eric/GUI/icons/jswindow/run.png", 12, 16));
runitem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent event) {
run(new File(path));
}
});
// to include this file
includeFileItem=new myJMenuItem("Inclure dans la figure");
includeFileItem.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
include(path);
}
});
//to include all scripts in this folder
includeFolderItem = new myJMenuItem("Inclure le dossier dans la figure");
includeFolderItem.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
includeFolder(new File(path));
}
});
if((new File(path)).isDirectory()){
myPopUpMenu.add(includeFolderItem);
} else {
myPopUpMenu.add(runitem);
myPopUpMenu.add(includeFileItem);
}
myPopUpMenu.show(e.getComponent(), e.getX()+15, e.getY());
}
public void run(File file){
String str="";
String mystr="";
try {
InputStream input=new FileInputStream(file);
BufferedReader in=new BufferedReader(new InputStreamReader(input, "UTF-8"));
while ((str=in.readLine())!=null) {
str=str.trim();
mystr+=str+"\n";
}
} catch(Exception ex){}
ScriptItem si = new ScriptItem(null, "anonymous", mystr);
items.add(si);
si.runScript();
}
public void include(String path){
JZirkelCanvas.getCurrentZC().openScriptFile(path, false);
}
public void includeFolder(File folder){
File[] f = folder.listFiles();
for(File file : f){
if(file.toString().endsWith(".js")){
include(file.toString());
} else if(file.isDirectory()){
includeFolder(file);
}
}
}
/*
* Scripts lancés depuis le panneau de gauche
*/
public ScriptItemsArray getScripts(){
return items;
}
}