提交 8e1c4e4c 编写于 作者: V vinnie

Merge

/*
* Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
......@@ -75,7 +75,7 @@ public class Main {
*/
InputStream is = Main.class.getResourceAsStream("/resources/" + name);
// current script file name for better error messages
engine.put(ScriptEngine.NAME, name);
engine.put(ScriptEngine.FILENAME, name);
// evaluate the script in the InputStream
engine.eval(new InputStreamReader(is));
}
......
/*
* Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
......@@ -37,7 +37,6 @@
* this sample code.
*/
/*
* This script can be loaded in jrunscript to start scriptpad.
*
......@@ -48,4 +47,3 @@ load("conc.js");
load("gui.js");
load("scriptpad.js");
load("mm.js");
/*
* Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
......@@ -37,15 +37,43 @@
* this sample code.
*/
/*
* Concurrency utilities for JavaScript. These are based on
* java.lang and java.util.concurrent API. The following functions
* java.lang and java.util.concurrent API. The following functions
* provide a simpler API for scripts. Instead of directly using java.lang
* and java.util.concurrent classes, scripts can use functions and
* objects exported from here.
* objects exported from here.
*/
// shortcut for j.u.c lock classes
var Lock = java.util.concurrent.locks.ReentrantLock;
var RWLock = java.util.concurrent.locks.ReentrantReadWriteLock;
// check if there is a build in sync function, define one if missing
if (typeof sync === "undefined") {
var sync = function(func, obj) {
if (arguments.length < 1 || arguments.length > 2 ) {
throw "sync(function [,object]) parameter count mismatch";
}
var syncobj = (arguments.length == 2 ? obj : this);
if (!syncobj._syncLock) {
syncobj._syncLock = new Lock();
}
return function() {
syncobj._syncLock.lock();
try {
func.apply(null, arguments);
} finally {
syncobj._syncLock.unlock();
}
};
};
sync.docString = "synchronize a function, optionally on an object";
}
/**
* Wrapper for java.lang.Object.wait
*
......@@ -58,7 +86,6 @@ function wait(object) {
}
wait.docString = "convenient wrapper for java.lang.Object.wait method";
/**
* Wrapper for java.lang.Object.notify
*
......@@ -71,7 +98,6 @@ function notify(object) {
}
notify.docString = "convenient wrapper for java.lang.Object.notify method";
/**
* Wrapper for java.lang.Object.notifyAll
*
......@@ -84,7 +110,6 @@ function notifyAll(object) {
}
notifyAll.docString = "convenient wrapper for java.lang.Object.notifyAll method";
/**
* Creates a java.lang.Runnable from a given script
* function.
......@@ -97,7 +122,7 @@ Function.prototype.runnable = function() {
func.apply(null, args);
}
}
}
};
/**
* Executes the function on a new Java Thread.
......@@ -106,7 +131,7 @@ Function.prototype.thread = function() {
var t = new java.lang.Thread(this.runnable.apply(this, arguments));
t.start();
return t;
}
};
/**
* Executes the function on a new Java daemon Thread.
......@@ -116,7 +141,7 @@ Function.prototype.daemon = function() {
t.setDaemon(true);
t.start();
return t;
}
};
/**
* Creates a java.util.concurrent.Callable from a given script
......@@ -128,7 +153,7 @@ Function.prototype.callable = function() {
return new java.util.concurrent.Callable() {
call: function() { return func.apply(null, args); }
}
}
};
/**
* Registers the script function so that it will be called exit.
......@@ -137,10 +162,10 @@ Function.prototype.atexit = function () {
var args = arguments;
java.lang.Runtime.getRuntime().addShutdownHook(
new java.lang.Thread(this.runnable.apply(this, args)));
}
};
/**
* Executes the function asynchronously.
* Executes the function asynchronously.
*
* @return a java.util.concurrent.FutureTask
*/
......@@ -152,13 +177,9 @@ Function.prototype.future = (function() {
(function() { theExecutor.shutdown(); }).atexit();
return function() {
return theExecutor.submit(this.callable.apply(this, arguments));
}
};
})();
// shortcut for j.u.c lock classes
var Lock = java.util.concurrent.locks.ReentrantLock;
var RWLock = java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* Executes a function after acquiring given lock. On return,
* (normal or exceptional), lock is released.
......@@ -179,7 +200,7 @@ Function.prototype.sync = function (lock) {
} finally {
lock.unlock();
}
}
};
/**
* Causes current thread to sleep for specified
......@@ -193,54 +214,92 @@ function sleep(interval) {
sleep.docString = "wrapper for java.lang.Thread.sleep method";
/**
* Schedules a task to be executed once in
* every N milliseconds specified.
* Schedules a task to be executed once in N milliseconds specified.
*
* @param callback function or expression to evaluate
* @param interval in milliseconds to sleep
* @return timeout ID (which is nothing but Thread instance)
*/
function setTimeout(callback, interval) {
if (! (callback instanceof Function)) {
if (! (callback instanceof Function) && typeof callback !== "function") {
callback = new Function(callback);
}
// start a new thread that sleeps given time
// and calls callback in an infinite loop
return (function() {
while (true) {
try {
sleep(interval);
} catch (x) { }
callback();
}).daemon();
}
setTimeout.docString = "calls given callback once after specified interval";
/**
* Cancels a timeout set earlier.
* @param tid timeout ID returned from setTimeout
*/
function clearTimeout(tid) {
// we just interrupt the timer thread
tid.interrupt();
}
clearTimeout.docString = "interrupt a setTimeout timer";
/**
* Schedules a task to be executed once in
* every N milliseconds specified.
*
* @param callback function or expression to evaluate
* @param interval in milliseconds to sleep
* @return timeout ID (which is nothing but Thread instance)
*/
function setInterval(callback, interval) {
if (! (callback instanceof Function) && typeof callback !== "function") {
callback = new Function(callback);
}
// start a new thread that sleeps given time
// and calls callback in an infinite loop
return (function() {
while (true) {
try {
sleep(interval);
} catch (x) {
break;
}
callback();
}
}).daemon();
}
setTimeout.docString = "calls given callback once after specified interval"
setInterval.docString = "calls given callback every specified interval";
/**
/**
* Cancels a timeout set earlier.
* @param tid timeout ID returned from setTimeout
*/
function clearTimeout(tid) {
function clearInterval(tid) {
// we just interrupt the timer thread
tid.interrupt();
}
clearInterval.docString = "interrupt a setInterval timer";
/**
* Simple access to thread local storage.
* Simple access to thread local storage.
*
* Script sample:
*
* __thread.x = 44;
* function f() {
* __thread.x = 'hello';
* print(__thread.x);
* function f() {
* __thread.x = 'hello';
* print(__thread.x);
* }
* f.thread(); // prints 'hello'
* print(__thread.x); // prints 44 in main thread
*/
var __thread = (function () {
var map = new Object();
return new JSAdapter() {
return new JSAdapter({
__has__: function(name) {
return map[name] != undefined;
},
......@@ -263,8 +322,8 @@ var __thread = (function () {
__delete__: function(name) {
if (map[name] != undefined) {
map[name].set(null);
}
}
}
}
});
})();
/*
* Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
......@@ -37,16 +37,15 @@
* this sample code.
*/
/*
* Few user interface utilities.
* Few user interface utilities.
*/
if (this.window === undefined) {
this.window = null;
}
/**
/**
* Swing invokeLater - invokes given function in AWT event thread
*/
Function.prototype.invokeLater = function() {
......@@ -54,13 +53,13 @@ Function.prototype.invokeLater = function() {
var func = this;
var args = arguments;
SwingUtilities.invokeLater(new java.lang.Runnable() {
run: function() {
run: function() {
func.apply(func, args);
}
});
}
};
/**
/**
* Swing invokeAndWait - invokes given function in AWT event thread
* and waits for it's completion
*/
......@@ -69,11 +68,11 @@ Function.prototype.invokeAndWait = function() {
var func = this;
var args = arguments;
SwingUtilities.invokeAndWait(new java.lang.Runnable() {
run: function() {
run: function() {
func.apply(func, args);
}
});
}
};
/**
* Am I running in AWT event dispatcher thread?
......@@ -85,22 +84,24 @@ function isEventThread() {
isEventThread.docString = "returns whether the current thread is GUI thread";
/**
* Opens a file dialog box
* Opens a file dialog box
*
* @param curDir current directory [optional]
* @param save flag tells whether this is a save dialog or not
* @return selected file or else null
*/
function fileDialog(curDir, save) {
function fileDialog(curDir, save) {
var result;
function _fileDialog() {
if (curDir == undefined) {
curDir = new java.io.File(".");
}
var JFileChooser = javax.swing.JFileChooser;
var dialog = new JFileChooser(curDir);
var res = save? dialog.showSaveDialog(window):
dialog.showOpenDialog(window);
var dialog = new JFileChooser(curDir);
var res = save ? dialog.showSaveDialog(window):
dialog.showOpenDialog(window);
if (res == JFileChooser.APPROVE_OPTION) {
result = dialog.getSelectedFile();
} else {
......@@ -113,37 +114,41 @@ function fileDialog(curDir, save) {
} else {
_fileDialog.invokeAndWait();
}
return result;
}
fileDialog.docString = "show a file dialog box";
/**
* Opens a color chooser dialog box
* Opens a color chooser dialog box
*
* @param title of the dialog box [optional]
* @param color default color [optional]
* @return choosen color or default color
*/
function colorDialog(title, color) {
var result;
function _colorDialog() {
if (title == undefined) {
title = "Choose Color";
}
if (color == undefined) {
color = java.awt.Color.BLACK;
}
var chooser = new javax.swing.JColorChooser();
var res = chooser.showDialog(window, title, color);
result = res? res : color;
}
result = res ? res : color;
}
if (isEventThread()) {
_colorDialog();
} else {
_colorDialog.invokeAndWait();
}
return result;
}
colorDialog.docString = "shows a color chooser dialog box";
......@@ -156,15 +161,15 @@ colorDialog.docString = "shows a color chooser dialog box";
* @param msgType type of message box [constants in JOptionPane]
*/
function msgBox(msg, title, msgType) {
function _msgBox() {
function _msgBox() {
var JOptionPane = javax.swing.JOptionPane;
if (msg === undefined) msg = "undefined";
if (msg === null) msg = "null";
if (title == undefined) title = msg;
if (msgType == undefined) type = JOptionPane.INFORMATION_MESSAGE;
if (msgType == undefined) msgType = JOptionPane.INFORMATION_MESSAGE;
JOptionPane.showMessageDialog(window, msg, title, msgType);
}
if (isEventThread()) {
_msgBox();
} else {
......@@ -172,13 +177,13 @@ function msgBox(msg, title, msgType) {
}
}
msgBox.docString = "shows MessageBox to the user";
/**
* Shows an information alert box
*
* @param msg message to be shown
* @param title title of message box [optional]
*/
*/
function alert(msg, title) {
var JOptionPane = javax.swing.JOptionPane;
msgBox(msg, title, JOptionPane.INFORMATION_MESSAGE);
......@@ -197,7 +202,6 @@ function error(msg, title) {
}
error.docString = "shows an error message box to the user";
/**
* Shows a warning alert box
*
......@@ -210,7 +214,6 @@ function warn(msg, title) {
}
warn.docString = "shows a warning message box to the user";
/**
* Shows a prompt dialog box
*
......@@ -225,11 +228,13 @@ function prompt(question, answer) {
if (answer == undefined) answer = "";
result = JOptionPane.showInputDialog(window, question, answer);
}
if (isEventThread()) {
_prompt();
} else {
_prompt.invokeAndWait();
}
return result;
}
prompt.docString = "shows a prompt box to the user and returns the answer";
......@@ -244,30 +249,33 @@ prompt.docString = "shows a prompt box to the user and returns the answer";
function confirm(msg, title) {
var result;
var JOptionPane = javax.swing.JOptionPane;
function _confirm() {
if (title == undefined) title = msg;
var optionType = JOptionPane.YES_NO_OPTION;
result = JOptionPane.showConfirmDialog(window, msg, title, optionType);
}
if (isEventThread()) {
_confirm();
} else {
_confirm.invokeAndWait();
}
}
return result == JOptionPane.YES_OPTION;
}
confirm.docString = "shows a confirmation message box to the user";
/**
* Exit the process after confirmation from user
*
* Exit the process after confirmation from user
*
* @param exitCode return code to OS [optional]
*/
function exit(exitCode) {
if (exitCode == undefined) exitCode = 0;
if (confirm("Do you really want to exit?")) {
java.lang.System.exit(exitCode);
}
}
}
exit.docString = "exits jconsole";
......
/*
* Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
......@@ -37,10 +37,9 @@
* this sample code.
*/
/*
* This is a collection of utilities for Monitoring
* and management API.
* and management API.
*
* File dependency:
* conc.js -> for concurrency utilities
......@@ -71,14 +70,14 @@ function jmxConnect(hostport) {
}
jmxConnect.docString = "connects to the given host, port (specified as name:port)";
function mbeanConnection() {
if (mmConnection == null) {
function mbeanConnection() {
if (mmConnection == null) {
throw "Not connected to MBeanServer yet!";
}
return mmConnection;
}
mbeanConnection.docString = "returns the current MBeanServer connection"
mbeanConnection.docString = "returns the current MBeanServer connection";
/**
* Returns a platform MXBean proxy for given MXBean name and interface class
......@@ -102,7 +101,6 @@ function objectName(objName) {
}
objectName.docString = "creates JMX ObjectName for a given String";
/**
* Creates a new (M&M) Attribute object
*
......@@ -146,7 +144,6 @@ function queryNames(objName, query) {
}
queryNames.docString = "returns QueryNames using given ObjectName and optional query";
/**
* Queries with given ObjectName and QueryExp.
* QueryExp may be null.
......@@ -220,7 +217,6 @@ function getMBeanAttribute(objName, attrName) {
}
getMBeanAttribute.docString = "returns a single Attribute of given ObjectName";
// sets MBean attributes
function setMBeanAttributes(objName, attrList) {
objName = objectName(objName);
......@@ -237,7 +233,6 @@ function setMBeanAttribute(objName, attrName, attrValue) {
}
setMBeanAttribute.docString = "sets a single Attribute of given ObjectName";
// invokes an operation on given MBean
function invokeMBean(objName, operation, params, signature) {
objName = objectName(objName);
......@@ -260,16 +255,17 @@ invokeMBean.docString = "invokes MBean operation on given ObjectName";
* will be of type FutureTask. When you need value, call 'get' on it.
*/
function mbean(objName, async) {
var index;
objName = objectName(objName);
var info = mbeanInfo(objName);
var info = mbeanInfo(objName);
var attrs = info.attributes;
var attrMap = new Object;
for (var index in attrs) {
for (index in attrs) {
attrMap[attrs[index].name] = attrs[index];
}
var opers = info.operations;
var operMap = new Object;
for (var index in opers) {
for (index in opers) {
operMap[opers[index].name] = opers[index];
}
......@@ -288,9 +284,9 @@ function mbean(objName, async) {
__get__: function (name) {
if (isAttribute(name)) {
if (async) {
return getMBeanAttribute.future(objName, name);
return getMBeanAttribute.future(objName, name);
} else {
return getMBeanAttribute(objName, name);
return getMBeanAttribute(objName, name);
}
} else if (isOperation(name)) {
var oper = operMap[name];
......@@ -302,12 +298,12 @@ function mbean(objName, async) {
sigNames[index] = sigs[index].getType();
}
if (async) {
return invokeMBean.future(objName, name,
return invokeMBean.future(objName, name,
params, sigNames);
} else {
return invokeMBean(objName, name, params, sigNames);
}
}
};
} else {
return undefined;
}
......@@ -327,9 +323,9 @@ function mbean(objName, async) {
}
mbean.docString = "returns a conveninent script wrapper for a MBean of given ObjectName";
if (this.application != undefined) {
this.application.addTool("JMX Connect",
// connect to a JMX MBean Server
if (this.application != undefined) {
this.application.addTool("JMX Connect",
// connect to a JMX MBean Server
function () {
var url = prompt("Connect to JMX server (host:port)");
if (url != null) {
......
/*
* Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
......@@ -37,33 +37,30 @@
* this sample code.
*/
/*
* This function uses new Swing Desktop API in JDK 6.
* To use this with scriptpad, open this in scriptpad
* and use "Tools->Run Script" menu.
*/
function browse() {
with (guiPkgs) {
var desktop = null;
// Before more Desktop API is used, first check
// whether the API is supported by this particular
// virtual machine (VM) on this particular host.
if (Desktop.isDesktopSupported()) {
desktop = Desktop.getDesktop();
} else {
alert("no desktop support");
return;
}
var desktop = null;
// Before more Desktop API is used, first check
// whether the API is supported by this particular
// virtual machine (VM) on this particular host.
if (java.awt.Desktop.isDesktopSupported()) {
desktop = java.awt.Desktop.getDesktop();
} else {
alert("no desktop support");
return;
}
if (desktop.isSupported(Desktop.Action.BROWSE)) {
var url = prompt("Address:");
if (url != null) {
desktop.browse(new java.net.URI(url));
}
} else {
alert("no browser support");
if (desktop.isSupported(java.awt.Desktop.Action.BROWSE)) {
var url = prompt("Address:");
if (url != null) {
desktop.browse(new java.net.URI(url));
}
} else {
alert("no browser support");
}
}
......@@ -71,4 +68,3 @@ if (this.application != undefined) {
// add "Browse" menu item under "Tools" menu
this.application.addTool("Browse", browse);
}
/*
* Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
......@@ -37,7 +37,6 @@
* this sample code.
*/
/*
* This script adds "Insert File" mode menu item to "Tools" menu.
* When selected, this menu shows a file dialog box and inserts
......@@ -48,18 +47,22 @@ if (this.application) {
application.addTool("Insert File...",
function() {
var file = fileDialog();
if (file) {
if (file) {
var reader = new java.io.FileReader(file);
var arr = java.lang.reflect.Array.newInstance(
java.lang.Character.TYPE, 8*1024); // 8K at a time
var buf = new java.lang.StringBuffer();
var numChars;
while ((numChars = reader.read(arr, 0, arr.length)) > 0) {
buf.append(arr, 0, numChars);
}
var pos = application.editor.caretPosition;
var doc = application.editor.document;
doc.insertString(pos, buf.toString(), null);
}
})
});
}
/*
* Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
......@@ -37,19 +37,15 @@
* this sample code.
*/
/*
* This script adds "Line Wrap" mode menu item to "Tools" menu.
* When selected, this menu toggles the current word wrap mode
* of the editor.
*/
with (guiPkgs) {
function toggleLineWrap() {
var wrap = application.editor.lineWrap;
application.editor.lineWrap = !wrap;
}
application.addTool("Line Wrap", toggleLineWrap);
function toggleLineWrap() {
var wrap = application.editor.lineWrap;
application.editor.lineWrap = !wrap;
}
application.addTool("Line Wrap", toggleLineWrap);
/*
* Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
......@@ -37,30 +37,27 @@
* this sample code.
*/
/*
* This function uses new Swing Desktop API in JDK 6.
* To use this with scriptpad, open this in scriptpad
* and use "Tools->Run Script" menu.
*/
function mail() {
with (guiPkgs) {
var desktop = null;
// Before more Desktop API is used, first check
// whether the API is supported by this particular
// virtual machine (VM) on this particular host.
if (Desktop.isDesktopSupported()) {
desktop = Desktop.getDesktop();
} else {
alert("no desktop support");
return;
}
var desktop = null;
// Before more Desktop API is used, first check
// whether the API is supported by this particular
// virtual machine (VM) on this particular host.
if (java.awt.Desktop.isDesktopSupported()) {
desktop = java.awt.Desktop.getDesktop();
} else {
alert("no desktop support");
return;
}
if (desktop.isSupported(Desktop.Action.MAIL)) {
var mailTo = prompt("Mail To:");
if (mailTo != null) {
desktop.mail(new java.net.URI("mailto", mailTo, null));
}
if (desktop.isSupported(java.awt.Desktop.Action.MAIL)) {
var mailTo = prompt("Mail To:");
if (mailTo != null) {
desktop.mail(new java.net.URI("mailto", mailTo, null));
}
}
}
......
/*
* Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
......@@ -37,36 +37,37 @@
* this sample code.
*/
// this checker function runs asynchronously
function memoryChecker(memoryBean, threshold, interval) {
while (true) {
var memUsage = memoryBean.HeapMemoryUsage;
var usage = memUsage.get("used") / (1024 * 1024);
println(usage);
println("usage: " + usage);
if (usage > threshold) {
alert("Hey! heap usage threshold exceeded!");
// after first alert just return.
return;
}
java.lang.Thread.currentThread().sleep(interval);
java.lang.Thread.sleep(interval);
}
}
// add "Tools->Memory Monitor" menu item
if (this.application != undefined) {
this.application.addTool("Memory Monitor",
this.application.addTool("Memory Monitor",
function () {
// show threshold box with default of 50 MB
var threshold = prompt("Threshold (mb)", 50);
// show interval box with default of 1000 millisec.
var interval = prompt("Sample Interval (ms):", 1000);
var memoryBean = mbean("java.lang:type=Memory");
// ".future" makes the function to be called
// ".future" makes the function to be called
// asynchronously in a separate thread.
memoryChecker.future(memoryBean, threshold, interval);
});
}
/*
* Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
......@@ -37,7 +37,6 @@
* this sample code.
*/
/*
* This script serves as a simple "monitored application".
* Start this script using memory.bat or memory.sh in the
......@@ -45,12 +44,11 @@
*/
java.lang.System.out.print("Enter a number and press enter:");
java.lang.System["in"].read();
var input = java.lang.System["in"].read();
// allocate an integer array of "big enough" size!
var a = java.lang.reflect.Array.newInstance(
java.lang.Integer.TYPE, 1024*1024);
// loop forever!
while (true);
java.lang.Integer.TYPE, input * 1024 * 1024);
// sleep some time...
java.lang.Thread.sleep(10*60*1000);
......@@ -30,7 +30,3 @@
#
jrunscript -J-Dcom.sun.management.jmxremote.port=1090 -J-Dcom.sun.management.jmxremote.ssl=false -J-Dcom.sun.management.jmxremote.authenticate=false memory.js
/*
* Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
......@@ -37,14 +37,13 @@
* this sample code.
*/
/*
* This script adds "Selected Text Color" menu item to "Tools" menu.
* When selected, this menu changes the "selected text" color.
*/
if (this.application) {
application.addTool("Selected Text Color...",
function() {
function() {
var color = application.editor.selectedTextColor;
color = colorDialog("Selected Text Color", color);
application.editor.selectedTextColor = color;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册