[RText] / RText / trunk / src / org / fife / rtext / plugins / tools / Tool.java Repository:
ViewVC logotype

Diff of /RText/trunk/src/org/fife/rtext/plugins/tools/Tool.java

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 58, Tue Mar 9 04:03:03 2010 UTC revision 59, Tue Mar 16 03:33:39 2010 UTC
# Line 28  Line 28 
28  import java.text.MessageFormat;  import java.text.MessageFormat;
29  import java.util.ArrayList;  import java.util.ArrayList;
30  import java.util.HashMap;  import java.util.HashMap;
31    import java.util.Iterator;
32  import java.util.List;  import java.util.List;
33  import java.util.Map;  import java.util.Map;
34    import java.util.regex.Matcher;
35    import java.util.regex.Pattern;
36    
37  import org.fife.io.ProcessRunner;  import org.fife.io.ProcessRunner;
38  import org.fife.io.ProcessRunnerOutputListener;  import org.fife.io.ProcessRunnerOutputListener;
39    import org.fife.rtext.RText;
40    import org.fife.rtext.RTextEditorPane;
41    
42    
43  /**  /**
# Line 55  Line 60 
60          private Map env;          private Map env;
61          private boolean appendEnv;          private boolean appendEnv;
62          private String accelerator; // String to ease serialization          private String accelerator; // String to ease serialization
63            private transient RText rtext;
64    
65            private static final Pattern VAR_PATTERN =
66                            Pattern.compile("\\$\\{file_(?:name|name_no_ext|dir|full_path)\\}");
67    
68    
69          /**          /**
# Line 194  Line 203 
203           */           */
204          public void execute(final ProcessRunnerOutputListener l) {          public void execute(final ProcessRunnerOutputListener l) {
205    
206                    // Replace any ${file_XXX} "variables" in the command line.
207                  final String[] cmd = new String[1 + args.size()];                  final String[] cmd = new String[1 + args.size()];
208                  cmd[0] = program;                  cmd[0] = program;
209                  for (int i=0; i<args.size(); i++) {                  for (int i=0; i<args.size(); i++) {
210                          cmd[i+1] = (String)args.get(i);                          cmd[i+1] = varSubstitute((String)args.get(i));
211                  }                  }
212    
213                    // Replace any ${file_XXX} "variables" in the environment.
214                    final Map env2 = env==null ? null : new HashMap(env);
215                    if (env2!=null) {
216                            for (Iterator i=env2.keySet().iterator(); i.hasNext(); ) {
217                                    Object key = i.next();
218                                    String value = (String)env2.get(key);
219                                    env2.put(key, varSubstitute(value));
220                            }
221                    }
222    
223                    // Run this tool in a separate thread.
224                  Thread t = new Thread() {                  Thread t = new Thread() {
225                          public void run() {                          public void run() {
226                                  ProcessRunner pr = new ProcessRunner(cmd);                                  ProcessRunner pr = new ProcessRunner(cmd);
227                                  pr.setDirectory(new File(getDirectory()));                                  pr.setDirectory(new File(getDirectory()));
228                                  pr.setEnvironmentVars(env, appendEnv);                                  pr.setEnvironmentVars(env2, appendEnv);
229                                  pr.setOutputListener(l);                                  pr.setOutputListener(l);
230                                  pr.run();                                  pr.run();
231                          }                          }
232                  };                  };
   
233                  t.start();                  t.start();
234    
235          }          }
# Line 351  Line 371 
371    
372    
373          /**          /**
374             * Copied from 1.5's Matcher.quoteReplacement() method, since we work in
375             * 1.4.
376             *
377             * @param s The string to be used in a Matcher.appendReplacement() call.
378             * @return The string, with slashes ('<tt>\</tt>') and dollar signs
379             * ('<tt>$</tt>') quoted.
380             */
381            // TODO: When we drop 1.4 support, remove this method.
382            private static String quoteReplacement(String s) {
383                    if ((s.indexOf('\\') == -1) && (s.indexOf('$') == -1))
384                            return s;
385                    StringBuffer sb = new StringBuffer();
386                    for (int i = 0; i < s.length(); i++) {
387                            char c = s.charAt(i);
388                            if (c == '\\') {
389                                    sb.append('\\');
390                                    sb.append('\\');
391                            } else if (c == '$') {
392                                    sb.append('\\');
393                                    sb.append('$');
394                            } else {
395                                    sb.append(c);
396                            }
397                    }
398                    return sb.toString();
399            }
400    
401    
402            /**
403           * Sets the accelerator to use to activate this tool in a menu.           * Sets the accelerator to use to activate this tool in a menu.
404           *           *
405           * @param accelerator The accelerator to use, or <code>null</code> for           * @param accelerator The accelerator to use, or <code>null</code> for
# Line 456  Line 505 
505          }          }
506    
507    
508            /**
509             * Sets the parent application that handles "variable" substitution in
510             * arguments and environment variables before execution.
511             *
512             * @param rtext The parent application.
513             */
514            void setRText(RText rtext) {
515                    this.rtext = rtext;
516            }
517    
518    
519            /**
520             * Replaces any "variables" having to do with the current text area
521             * in the specified string.
522             *
523             * @param str The string.
524             * @return The same string, with any variables replaced with their values.
525             */
526            private String varSubstitute(String str) {
527    
528                    // Bail early if on (likely) variables
529                    if (str.indexOf("${file_")==-1) {
530                            return str;
531                    }
532    
533                    RTextEditorPane textArea = rtext.getMainView().getCurrentTextArea();
534                    Matcher m = VAR_PATTERN.matcher(str);
535                    StringBuffer sb = new StringBuffer();
536    
537                    while (m.find()) {
538                            String var = m.group(0);
539                            String temp = null;
540                            if ("${file_name}".equals(var)) {
541                                    temp = textArea.getFileName();
542                            }
543                            else if ("${file_name_no_ext}".equals(var)) {
544                                    temp = textArea.getFileName();
545                                    int dot = temp.lastIndexOf('.');
546                                    if (dot>-1) {
547                                            temp = temp.substring(0, dot);
548                                    }
549                            }
550                            else if ("${file_dir}".equals(var)) {
551                                    temp = textArea.getFileFullPath();
552                                    int slash = temp.lastIndexOf('/');
553                                    slash = Math.max(slash, temp.lastIndexOf('\\'));
554                                    temp = temp.substring(0, slash);
555                            }
556                            else if ("${file_full_path}".equals(var)) {
557                                    temp = textArea.getFileFullPath();
558                            }
559                            m.appendReplacement(sb, quoteReplacement(temp));
560                    }
561    
562                    m.appendTail(sb);
563                    return sb.toString();
564    
565            }
566    
567    
568          public static void main(String[] args) {          public static void main(String[] args) {
569                  Tool tool = new Tool("Name", "Desc");                  Tool tool = new Tool("Name", "Desc");
570                  tool.setProgram("C:/temp/test.bat");                  tool.setProgram("C:/temp/test.bat");
# Line 474  Line 583 
583                          }                          }
584                  });                  });
585          }          }
586    
587    
588  }  }

Legend:
Removed from v.58  
changed lines
  Added in v.59

Contact webmaster
ViewVC Help
Powered by ViewVC 1.0.5