00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 package com.generalrobotix.ui.view;
00020
00021
00022 import java.awt.Frame;
00023 import java.io.File;
00024 import java.io.IOException;
00025 import java.io.PrintWriter;
00026 import java.io.Writer;
00027 import java.net.URL;
00028 import java.util.LinkedList;
00029 import java.util.List;
00030
00031 import javax.swing.JOptionPane;
00032
00033 import org.eclipse.jface.action.Action;
00034 import org.eclipse.jface.action.ActionContributionItem;
00035 import org.eclipse.jface.action.IAction;
00036 import org.eclipse.jface.action.IContributionItem;
00037 import org.eclipse.jface.action.ICoolBarManager;
00038 import org.eclipse.jface.action.IToolBarManager;
00039 import org.eclipse.jface.action.ToolBarContributionItem;
00040 import org.eclipse.jface.dialogs.MessageDialog;
00041 import org.eclipse.jface.window.ApplicationWindow;
00042 import org.eclipse.swt.SWT;
00043 import org.eclipse.swt.awt.SWT_AWT;
00044 import org.eclipse.swt.custom.StyledText;
00045 import org.eclipse.swt.custom.VerifyKeyListener;
00046 import org.eclipse.swt.events.SelectionEvent;
00047 import org.eclipse.swt.events.SelectionListener;
00048 import org.eclipse.swt.events.VerifyEvent;
00049 import org.eclipse.swt.graphics.Image;
00050 import org.eclipse.swt.layout.GridData;
00051 import org.eclipse.swt.layout.GridLayout;
00052 import org.eclipse.swt.widgets.Button;
00053 import org.eclipse.swt.widgets.Composite;
00054 import org.eclipse.swt.widgets.Display;
00055 import org.eclipse.ui.IWorkbenchWindow;
00056 import org.eclipse.ui.PlatformUI;
00057 import org.python.core.Py;
00058 import org.python.core.PyList;
00059 import org.python.core.PyString;
00060 import org.python.util.InteractiveInterpreter;
00061
00062 import com.generalrobotix.ui.GrxBaseItem;
00063 import com.generalrobotix.ui.GrxBaseView;
00064 import com.generalrobotix.ui.GrxBaseViewPart;
00065 import com.generalrobotix.ui.GrxPluginManager;
00066 import com.generalrobotix.ui.grxui.Activator;
00067 import com.generalrobotix.ui.item.GrxPythonScriptItem;
00068 import com.generalrobotix.ui.util.GrxCorbaUtil;
00069 import com.generalrobotix.ui.util.MessageBundle;
00070
00071 @SuppressWarnings("serial")
00075 public class GrxJythonPromptView extends GrxBaseView {
00076 private InteractiveInterpreter interpreter_ = new InteractiveInterpreter();
00077 private Thread thread_1_;
00078 private Thread thread_2_;
00079 private String prompt_ = ">>> ";
00080 private Display display_;
00081 private Composite parent_;
00082 private StyledText styledText_;
00083 private MenuDialog menuDialog;
00084 private Frame frame_;
00085 private static final int HISTORY_SIZE = 50;
00086 private List<String> history_ = new LinkedList<String>();
00087 private int hpos_ = 0;
00088 private String com_;
00089 private Button btnExec_;
00090 private Writer writer_;
00091 private GrxPythonScriptItem currentItem_;
00092 private String message_;
00093 private Object result_;
00094
00095 private static final int KS_SHIFT = SWT.SHIFT;
00096 private static final int KS_CONTROL = SWT.CTRL;
00097 private static final int KS_CTRL_U = 'u' | SWT.CTRL;
00098 private static final int KS_CTRL_A = 'a' | SWT.CTRL;
00099 private static final int KS_CTRL_E = 'e' | SWT.CTRL;
00100 private static final int KS_CTRL_F = 'f' | SWT.CTRL;
00101 private static final int KS_CTRL_B = 'b' | SWT.CTRL;
00102 private static final int KS_CTRL_N = 'n' | SWT.CTRL;
00103 private static final int KS_CTRL_P = 'p' | SWT.CTRL;
00104 private static final int KS_UP = SWT.ARROW_UP;
00105 private static final int KS_DOWN = SWT.ARROW_DOWN;
00106 private static final int KS_LEFT = SWT.ARROW_LEFT;
00107 private static final int KS_RIGHT = SWT.ARROW_RIGHT;
00108 private static final int KS_ENTER = SWT.CR;
00109 private static final int KS_ENTER_ALT = SWT.CR | SWT.ALT;
00110 private static final int KS_ENTER_CTRL = SWT.CR | SWT.CTRL;
00111 private static final int KS_ENTER_SHIFT = SWT.CR | SWT.SHIFT;
00112 private static final int KS_BACK_SPACE = SWT.BS;
00113 private static final int KS_DELETE = SWT.DEL;
00114
00115 private Image simScriptStartIcon_;
00116 private Image simScriptStopIcon_;
00117 private StyledTextWriter stWriter_;
00118
00119 private static final int INTERVAL=100;
00120
00128 public GrxJythonPromptView(String name, GrxPluginManager manager, GrxBaseViewPart vp, Composite parent) {
00129 super(name, manager, vp, parent);
00130
00131 display_ = parent.getDisplay();
00132 parent_ = parent;
00133 composite_.setLayout(new GridLayout(1,false));
00134 simScriptStartIcon_ = Activator.getDefault().getImage( "sim_script_start.png" );
00135 simScriptStopIcon_ = Activator.getDefault().getImage( "sim_script_stop.png");
00136 frame_ = SWT_AWT.new_Frame(new Composite(parent.getShell(),SWT.EMBEDDED));
00137
00138 btnExec_ = new Button(composite_,SWT.TOGGLE);
00139 btnExec_.setImage(simScriptStartIcon_);
00140 btnExec_.setText(MessageBundle.get("GrxJythonPromptView.button.execute"));
00141
00142
00143 btnExec_.setEnabled(false);
00144
00145 styledText_ = new StyledText(composite_,SWT.MULTI|SWT.V_SCROLL|SWT.WRAP);
00146 styledText_.setEditable(false);
00147 styledText_.setText(prompt_);
00148 styledText_.addVerifyKeyListener(new ConsoleKeyListener());
00149 styledText_.setEditable(true);
00150 styledText_.setLayoutData(new GridData(GridData.FILL_BOTH));
00151
00152 btnExec_.addSelectionListener(new SelectionListener(){
00153
00154 public void widgetDefaultSelected(SelectionEvent e) {
00155 }
00156
00157 public void widgetSelected(SelectionEvent e) {
00158 selectedExecBtn();
00159 }
00160
00161 });
00162
00163
00164 stWriter_ = new StyledTextWriter();
00165 writer_ = new PrintWriter(stWriter_);
00166 interpreter_.setErr(writer_);
00167 interpreter_.setOut(writer_);
00168 interpreter_.set("uimanager", manager_);
00169 interpreter_.exec("import sys");
00170 String dir = Activator.getDefault().getPreferenceStore().getString("JYTHON_LIB");
00171 if(dir.equals(""))
00172 dir = System.getenv("JYTHON_LIB");
00173 if(dir!=null){
00174 String dirs[] = dir.split(":");
00175 for (int i=0; i<dirs.length; i++){
00176 File f = new File(dirs[i]);
00177 if (f.exists()){
00178 interpreter_.exec("sys.path.append('"+dirs[i]+"')");
00179 File[] files = f.listFiles();
00180 for (int j=0; j<files.length; j++){
00181 if (files[j].getName().endsWith(".jar")){
00182 interpreter_.exec("sys.path.append('"+files[j].getAbsolutePath()+"')");
00183 }
00184 }
00185 }
00186 }
00187 }
00188 dir = Activator.getDefault().getPreferenceStore().getString("PROJECT_DIR");
00189 if(dir.equals(""))
00190 dir = System.getenv("PROJECT_DIR");
00191 if(dir!=null)
00192 dir += "/../script";
00193 if(dir !=null && new File(dir).exists())
00194 interpreter_.exec("sys.path.append('"+dir+"')");
00195 URL[] urls = manager_.pluginLoader_.getURLs();
00196 for (int i=0; i<urls.length; i++) {
00197 interpreter_.exec("sys.path.append('"+urls[i].getPath()+"')");
00198 interpreter_.exec("print \"sys.path.append(\'"+urls[i].getPath()+"\')\"");
00199 }
00200 if(dir!=null && new File(dir).exists())
00201 interpreter_.exec("import rbimporter");
00202 interpreter_.exec("import __builtin__");
00203
00204 interpreter_.set("view", this);
00205 interpreter_.exec("__builtin__.waitInput = view.waitInput");
00206 interpreter_.exec("__builtin__.waitInputConfirm = view.waitInputConfirm");
00207 interpreter_.exec("__builtin__.waitInputSelect = view.waitInputSelect");
00208 interpreter_.exec("__builtin__.waitInputMessage = view.waitInputMessage");
00209 interpreter_.exec("__builtin__.waitInputMenu = view.waitInputMenu");
00210 interpreter_.exec("__builtin__.waitInputSetMessage = view.waitInputSetMessage");
00211 interpreter_.exec("del view\n");
00212 interpreter_.exec("del __builtin__");
00213 history_.add("");
00214 setNameService();
00215
00216 setMenuItem(new InitPythonAction());
00217 setScrollMinSize(SWT.DEFAULT,SWT.DEFAULT);
00218
00219 setUp();
00220 manager_.registerItemChangeListener(this, GrxPythonScriptItem.class);
00221
00222 Runnable stringOutRun_ = new Runnable() {
00223 public void run() {
00224 if(composite_!=null && !composite_.isDisposed()){
00225 Display display = composite_.getDisplay();
00226 if (!display.isDisposed()){
00227 display.timerExec(INTERVAL, this);
00228 String string=stWriter_.read();
00229 if(!string.equals("")){
00230 styledText_.append(string);
00231 styledText_.setCaretOffset(styledText_.getText().length());
00232 styledText_.setTopIndex(styledText_.getLineCount());
00233 }
00234 if(btnExec_.isEnabled() && btnExec_.getSelection()){
00235 if( (thread_1_==null || !thread_1_.isAlive()) && (thread_2_==null || !thread_2_.isAlive()) ){
00236 btnExec_.setSelection(false);
00237 styleExecBtn(false);
00238 }
00239 }
00240 }
00241 }
00242 }
00243 };
00244 Display display = composite_.getDisplay();
00245 if (!display.isDisposed())
00246 display.timerExec(INTERVAL, stringOutRun_);
00247
00248 updateEditerFont();
00249 }
00250
00251 public void setUp(){
00252 currentItem_ = manager_.<GrxPythonScriptItem>getSelectedItem(GrxPythonScriptItem.class, null);
00253 btnExec_.setEnabled(currentItem_ != null);
00254 }
00255
00256 private class InitPythonAction extends Action{
00257 public InitPythonAction(){
00258 super("cleanup python",IAction.AS_PUSH_BUTTON);
00259 }
00260 public void run(){
00261 interpreter_.cleanup();
00262 interpreter_.exec("rbimporter.refresh()");
00263 }
00264 }
00265
00266 public void interrupt() {
00267 if (thread_1_ != null)
00268 interpreter_.interrupt(Py.getThreadState());
00269 if (thread_2_ != null) {
00270 interpreter_.interrupt(Py.getThreadState());
00271 }
00272 }
00273
00274 private class ConsoleKeyListener implements VerifyKeyListener {
00275
00276 public void verifyKey(VerifyEvent event) {
00277 int ks = event.keyCode | event.stateMask;
00278 int len = styledText_.getText().length();
00279 int cp = styledText_.getCaretOffset();
00280
00281 com_ = getCommand();
00282 event.doit = false;
00283 if (thread_1_ != null) {
00284 return;
00285 } else if (ks == KS_ENTER || ks == KS_ENTER_ALT
00286 || ks == KS_ENTER_CTRL || ks == KS_ENTER_SHIFT) {
00287 try {
00288 if (com_.trim().length() <= 0){
00289 styledText_.append("\n"+prompt_);
00290 styledText_.setCaretOffset(styledText_.getText().length());
00291 styledText_.setTopIndex(styledText_.getLineCount());
00292 }else{
00293 styledText_.append("\n");
00294 btnExec_.setSelection(true);
00295 styleExecBtn(true);
00296 final String com = com_.trim();
00297 thread_1_ = new Thread() {
00298 public void run() {
00299 result_=null;
00300 try{
00301 if (com.startsWith("dir(")) {
00302 interpreter_.exec("__tmp__ = " +com);
00303 result_ = interpreter_.eval("__tmp__");
00304 } else {
00305 result_ = interpreter_.eval(com);
00306 }
00307 }catch (org.python.core.PyException e) {
00308 try{
00309 interpreter_.exec(com);
00310 }catch( org.python.core.PyException exception ){
00311 result_ = exception.toString();
00312 }
00313 }
00314 history_.add(1, com);
00315 if (history_.size() > HISTORY_SIZE)
00316 history_.remove(HISTORY_SIZE-1);
00317 if (result_ != null)
00318 stWriter_.write(result_.toString()+"\n");
00319 stWriter_.write(prompt_);
00320 hpos_ = 0;
00321 thread_1_ = null;
00322 };
00323 };
00324 thread_1_.start();
00325 }
00326 } catch (Exception e) {
00327 e.printStackTrace();
00328 }
00329 } else if (ks == KS_CTRL_U) {
00330 styledText_.replaceTextRange(len - com_.length(), com_.length(),"");
00331 } else if (ks == KS_CTRL_A) {
00332 styledText_.setCaretOffset(len - com_.length());
00333 } else if (ks == KS_CTRL_E) {
00334 styledText_.setCaretOffset(len);
00335 } else if ((ks == KS_CTRL_F || ks == KS_RIGHT)) {
00336 if (cp < len)
00337 styledText_.setCaretOffset(cp + 1);
00338 } else if ((ks == KS_CTRL_B || ks == KS_LEFT)) {
00339 if (len - com_.length() < cp)
00340 styledText_.setCaretOffset(cp - 1);
00341 } else if (ks == KS_SHIFT) {
00342 } else if (ks == KS_CONTROL) {
00343 } else if (ks == KS_BACK_SPACE) {
00344 int p = styledText_.getText().lastIndexOf('\n') + prompt_.length() + 1;
00345 if (p < cp) {
00346 styledText_.replaceTextRange(cp - 1, 1,"");
00347 }
00348 } else if (ks == KS_DELETE) {
00349 if (cp < len) {
00350 styledText_.replaceTextRange( cp,1,"");
00351 }
00352 } else if (ks == KS_UP || ks == KS_CTRL_P) {
00353 if (hpos_ < history_.size() - 1) {
00354 int start = styledText_.getText().lastIndexOf('\n') + prompt_.length() + 1;
00355 if (start <= len)
00356 styledText_.replaceTextRange(start, len-start, history_.get(++hpos_));
00357 styledText_.setCaretOffset(styledText_.getText().length());
00358 }
00359 } else if (ks == KS_DOWN || ks == KS_CTRL_N) {
00360 styledText_.setCaretOffset(len);
00361 if (hpos_ > 0) {
00362 int start = styledText_.getText().lastIndexOf('\n') + prompt_.length() + 1;
00363 if (start <= len)
00364 styledText_.replaceTextRange(start, len-start,history_.get(--hpos_));
00365 }
00366 } else {
00367 if (cp <styledText_.getText().lastIndexOf('\n')) {
00368 cp = len;
00369 styledText_.setCaretOffset(len);
00370 }
00371 event.doit = true;
00372 }
00373 }
00374 }
00375
00376 public void execFile() {
00377 if (currentItem_ == null)
00378 return;
00379
00380 if (currentItem_.isEdited()) {
00381 boolean ans = MessageDialog.openConfirm(parent_.getShell(), MessageBundle.get("GrxJythonPromptView.dialog.title.exec"), MessageBundle.get("GrxJythonPromptView.dialog.message.exec"));
00382 if (!ans || !currentItem_.save())
00383 return;
00384 }
00385
00386 final String url = currentItem_.getURL(true);
00387 execFile(url);
00388 }
00389
00390 public void execFile(final String url) {
00391 setNameService();
00392 File f = new File(url);
00393 File p = f.getParentFile();
00394 interpreter_.exec("import sys");
00395 PyString pyStr = new PyString(p.getAbsolutePath());
00396 PyList pathList = (PyList)interpreter_.eval("sys.path");
00397 if (!pathList.__contains__(pyStr)) {
00398 String com = "sys.path.append(\""+p.getAbsolutePath()+"\")";
00399 interpreter_.exec("print '"+com+"'");
00400 interpreter_.exec(com);
00401 }
00402
00403 thread_2_ = new Thread() {
00404 public void run() {
00405 try {
00406 interpreter_.exec("print 'execfile("+url+")'");
00407 interpreter_.execfile(url);
00408 } catch (Exception e) {
00409 e.printStackTrace();
00410 }
00411 stWriter_.write(prompt_);
00412 hpos_ = 0;
00413 }
00414 };
00415 thread_2_.start();
00416 }
00417
00418 private String getCommand() {
00419 String com = styledText_.getText();
00420 int idx = com.lastIndexOf('\n');
00421 if (idx > 0)
00422 com = com.substring(idx + 1);
00423 return com.replaceFirst(prompt_, "");
00424 }
00425
00426 public void setNameService(){
00427 String nsHost = manager_.getProjectProperty("nsHost");
00428 String nsPort = manager_.getProjectProperty("nsPort");
00429 if (nsHost == null)
00430 nsHost = GrxCorbaUtil.nsHost();
00431 if (nsPort == null){
00432 Integer np = new Integer(GrxCorbaUtil.nsPort());
00433 nsPort = np.toString();
00434 }
00435
00436 String NS_OPT = "-ORBInitRef NameService=corbaloc:iiop:"+nsHost+":"+nsPort+"/NameService";
00437 System.setProperty("NS_OPT", NS_OPT);
00438 interpreter_.cleanup();
00439 interpreter_.exec("print 'NS_OPT="+NS_OPT+"'");
00440 interpreter_.exec("print '"+prompt_+"rbimporter.refresh()'");
00441 interpreter_.exec("rbimporter.refresh()");
00442 String nameservice = "could not parse";
00443 try {
00444 nameservice = NS_OPT.split("=")[1];
00445 } catch (Exception e) {
00446 interpreter_.exec("print 'failed to connect NameService("+nameservice+")'");
00447 }
00448 }
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476 public void registerItemChange(GrxBaseItem item, int event){
00477 if(item instanceof GrxPythonScriptItem){
00478 GrxPythonScriptItem pythonScriptItem = (GrxPythonScriptItem)item;
00479 switch(event){
00480 case GrxPluginManager.SELECTED_ITEM:
00481 currentItem_ = pythonScriptItem;
00482 btnExec_.setEnabled(true);
00483 break;
00484 case GrxPluginManager.REMOVE_ITEM:
00485 case GrxPluginManager.NOTSELECTED_ITEM:
00486 currentItem_ = null;
00487 btnExec_.setEnabled(false);
00488 break;
00489 default:
00490 break;
00491 }
00492 }
00493 }
00494
00495 public void waitInput(final String msg) {
00496 JOptionPane.showMessageDialog(frame_, msg);
00497 }
00498
00499 public void waitInputConfirm(final String msg) {
00500 int ans = JOptionPane.showConfirmDialog(frame_,
00501 msg,"waitInputConfirm",
00502 JOptionPane.OK_CANCEL_OPTION,
00503 JOptionPane.INFORMATION_MESSAGE,
00504 null);
00505 if (ans != JOptionPane.OK_OPTION)
00506 interrupt();
00507 }
00508
00509 public boolean waitInputSelect(final String msg) {
00510 int ans = JOptionPane.showConfirmDialog(frame_,
00511 msg,"waitInputSelect",
00512 JOptionPane.YES_NO_CANCEL_OPTION,
00513 JOptionPane.INFORMATION_MESSAGE,
00514 null);
00515 if (ans == JOptionPane.YES_OPTION)
00516 return true;
00517 else if (ans != JOptionPane.NO_OPTION)
00518 interrupt();
00519 return false;
00520 }
00521
00522 public Object waitInputMessage(String msg) {
00523 return JOptionPane.showInputDialog(frame_,
00524 msg, "waitInputMessage",
00525 JOptionPane.INFORMATION_MESSAGE,
00526 null,null,null);
00527 }
00528
00529 public void waitInputMenu(String[][] menuList) {
00530 menuDialog = new MenuDialog(menuList, interpreter_, message_, stWriter_);
00531 menuDialog.showDialog(frame_, currentItem_.getName(), false);
00532 }
00533 public void waitInputSetMessage(String msg) {
00534 message_ = msg;
00535 if(MenuDialog.getCurrentMenuDialog()!=null)
00536 menuDialog.setMessage(msg);
00537 }
00538
00539 public class StyledTextWriter extends Writer {
00540 private StringBuffer outString_ = null;
00541
00542 public StyledTextWriter() {
00543 outString_ = new StringBuffer();
00544 }
00545
00546 public void write(char[] cbuf, int off, int len) throws IOException {
00547 synchronized (lock) {
00548 if ((off < 0) || (off > cbuf.length) || (len < 0)
00549 || ((off + len) > cbuf.length) || ((off + len) < 0)) {
00550 throw new IndexOutOfBoundsException();
00551 } else if (len == 0) {
00552 }
00553
00554 char[] c = new char[len];
00555 System.arraycopy(cbuf, off, c, 0, len);
00556 outString_.append(c);
00557 }
00558 }
00559
00560 public void close() throws IOException {
00561 synchronized (lock) {
00562 }
00563 }
00564
00565 public void flush() throws IOException {
00566 synchronized (lock) {
00567 }
00568 }
00569
00570 public String read(){
00571 synchronized(lock){
00572 String str = outString_.toString();
00573 outString_.delete(0, outString_.length());
00574 return str;
00575 }
00576 }
00577
00578 public void write(String str){
00579 synchronized(lock){
00580 outString_.append(str);
00581 }
00582 }
00583
00584 }
00585
00586 public void shutdown(){
00587 manager_.removeItemChangeListener(this, GrxPythonScriptItem.class);
00588 }
00589
00590 public boolean getEnabledExecBtn(){
00591 return btnExec_.getEnabled();
00592 }
00593
00594 public void selectExecBtn(){
00595 btnExec_.setSelection(!btnExec_.getSelection());
00596 selectedExecBtn();
00597 }
00598
00599 private void selectedExecBtn(){
00600 if (btnExec_.getSelection()) {
00601 styleExecBtn(true);
00602 execFile();
00603 } else {
00604 styleExecBtn(false);
00605 interrupt();
00606 }
00607 }
00608
00609 private void styleExecBtn(boolean selected){
00610 IAction action = getStartSimulationAction();
00611 if(selected){
00612 btnExec_.setImage(simScriptStopIcon_);
00613 btnExec_.setToolTipText(MessageBundle.get("GrxJythonPromptView.text.interrupt"));
00614 if(action != null){
00615 action.setText("interrupt python threads");
00616 action.setImageDescriptor(Activator.getDefault().getDescriptor("sim_script_stop.png"));
00617 }
00618 }
00619 else{
00620 btnExec_.setImage(simScriptStartIcon_);
00621 btnExec_.setToolTipText(MessageBundle.get("GrxJythonPromptView.text.execute"));
00622 styledText_.setEnabled(true);
00623 if(action != null){
00624 action.setToolTipText("Execute Script File");
00625 action.setImageDescriptor(Activator.getDefault().getDescriptor("sim_script_start.png"));
00626 }
00627 }
00628 }
00629
00630 private IAction getStartSimulationAction()
00631 {
00632 IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows();
00633 for(IWorkbenchWindow w : windows){
00634 if(!(w instanceof ApplicationWindow))
00635 continue;
00636 ApplicationWindow window = (ApplicationWindow)w;
00637 ICoolBarManager coolbar = window.getCoolBarManager2();
00638 if(coolbar == null)
00639 continue;
00640 IContributionItem setitem = coolbar.find("com.generalrobotix.ui.actionSet");
00641 if(setitem != null && setitem instanceof ToolBarContributionItem)
00642 {
00643 IToolBarManager toolbar = ((ToolBarContributionItem)setitem).getToolBarManager();
00644 if(toolbar == null)
00645 continue;
00646 IContributionItem actitem = toolbar.find("com.generalrobotix.ui.actions.ExecuteScript");
00647 if(actitem != null && actitem instanceof ActionContributionItem)
00648 return ((ActionContributionItem)actitem).getAction();
00649 }
00650 }
00651 return null;
00652 }
00653
00654 public void updateEditerFont(){
00655 styledText_.setFont(Activator.getDefault().getFont("preference_editer"));
00656 }
00657 }