加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

kettle 里面的xul实现

发布时间:2020-12-15 01:39:57 所属栏目:百科 来源:网络整理
导读:从官方下载的Kettle3.2版本,大部分的界面已经可以显示为中文。基于Java对多国语言的支持,Kettle的汉化变得比较简单,只需修改相应的资源文件就可以了。 Kettle的多国语言资源文件非常多,总共有一百多个,分别放在不同的包的messages目录下面,而在message

从官方下载的Kettle3.2版本,大部分的界面已经可以显示为中文。基于Java对多国语言的支持,Kettle的汉化变得比较简单,只需修改相应的资源文件就可以了。

Kettle的多国语言资源文件非常多,总共有一百多个,分别放在不同的包的messages目录下面,而在messages目录的同一级,会有一个叫Messages的类。资源文件放到不同的目录下,有利于个模块单独开发,但建那么多一样的Messages类,似乎没有必要。

?

这些不是要说的重点,在完成所有资源文件的翻译之后,你会发现还是会有个别的地方,出现的是英文提示。一部分,通过搜索发现是因为源码里写死了,而另一部分却在源码里搜索不到。

例如,新建DB连接的时候,如果参数有误,点“测试”时,发现的提示窗的标题就是英文的。这个该死的英文到底写在哪里呢?

?

通过研究源码,找到负责"DB连接"配置对话框的类XulDatabaseDialog 。对话框打开时,下面的方法被调用

public String open() {

    XulDomContainer container = null;
    try {
      DatabaseConnectionDialog dcDialog = new DatabaseConnectionDialog();
      dcDialog.registerClass(EXTENDED_WIDGET_ID,EXTENDED_WIDGET_CLASSNAME);
      container = dcDialog.getSwtInstance(shell);  //Attention: onload: loadConnectionData() is called here the first time,see below for second time

      container.addEventHandler(EVENT_ID,DataOverrideHandler.class.getName());

      dataHandler = (DataOverrideHandler)container.getEventHandler(EVENT_ID);
      if (databaseMeta != null) {
        dataHandler.setData(databaseMeta);
      }
      dataHandler.setDatabases(databases);
      dataHandler.getControls();

    } catch (XulException e) {
      new ErrorDialog(parentShell,Messages.getString("XulDatabaseDialog.Error.Titel"),Messages //$NON-NLS-1$
          .getString("XulDatabaseDialog.Error.HandleXul"),e); //$NON-NLS-1$
      return null;
    }

......

?

org.pentaho.ui.xul.XulDomContainer这个类在kettle目录的/libext/pentaho/pentaho-xul-core-2.5.4.jar中,主要用来加载解决xul文件以及组件。其registerClass(..)方法用于注册组件。发编译其子类AbstractXulDomContainer,可以看到:

 @Deprecated
  public void addEventHandler(String id,String eventClassName)
    throws XulException
  {
    if (eventClassName.indexOf("groovy") > -1) {
      addGroovyHandler(id,eventClassName);
      return;
    }
    try
    {
      Class cls = Class.forName(eventClassName);
      AbstractXulEventHandler eventHandler = (AbstractXulEventHandler)cls.newInstance();
      eventHandler.setXulDomContainer(this);
      this.eventHandlers.put(id,eventHandler);
    }
    catch (ClassNotFoundException e) {
      logger.error("Event Handler Class Not Found",e);
      throw new XulException(e);
    } catch (Exception e) {
      logger.error("Error with Backing class creation",e);
      throw new XulException(e);
    }
  }

?

DatabaseConnectionDialog没有继承自其他类,主要用于指定"DB连接"配置对话框的xul文件。

container = dcDialog.getSwtInstance(shell); 

里面的实现,如下:

public XulDomContainer getSwtInstance(Shell shell) throws XulException
  {
    XulDomContainer container = null;
    SwtXulLoader loader = new SwtXulLoader();

    Iterable keyIterable = this.extendedClasses.keySet();
    for (Object key : keyIterable) {
      loader.register((String)key,(String)this.extendedClasses.get(key));
    }
    loader.setOuterContext(shell);
    container = loader.loadXul("org/pentaho/ui/database/databasedialog.xul",Messages.getBundle());
    return container;
  }

?

SwtXulLoader类在/libext/pentaho/pentaho-xul-swt-2.5.4.jar中,在SwtXulLoader实例化的时候,注册了许多默认的组件。

 public SwtXulLoader()
    throws XulException
  {
    this.parser.registerHandler("WINDOW","org.pentaho.ui.xul.swt.tags.SwtWindow");
    this.parser.registerHandler("DIALOG","org.pentaho.ui.xul.swt.tags.SwtDialog");
   ....

    this.parser.registerHandler("MESSAGEBOX","org.pentaho.ui.xul.swt.tags.SwtMessageBox");
....

?

我所举例的问题症结就在这个注册为"MESSAGEBOX"的组件上。

XulDatabaseDialog的open()方法中,后面的代码将使用其同级目录下的feature_override.xul替换databasedialog.xul的部分内容。

feature_override.xul可以看到,显示“测试”按钮的代码。

<hbox id="test-button-box">
			<label id="spacer-label" flex="5" />
			<button id="test-button" label="${DatabaseDialog.button.Test}


" flex="1" onclick="dataHandler.testDatabaseConnection()


" />
			<button id="feature-button" label="${DatabaseDialog.button.FeatureList}" flex="1" onclick="dataHandler.showFeatureList()" />
			<button id="explore-button" label="${DatabaseDialog.button.Explore}" flex="1" onclick="dataHandler.explore()" />
			<label id="spacer-label" flex="5" />
			
		</hbox>

?可以看到,按钮被点击时,将执行dataHander的testDatabaseConnection()方法。

?

XulDatabaseDialog的open()方法中 ,下面的代码已经将DataOverridHandler类注册为"dataHander"。

container.addEventHandler(EVENT_ID,DataOverrideHandler.class.getName());

?

org.pentaho.ui.database.event.DataHandler中,

public void testDatabaseConnection()
  {
    DatabaseMeta database = new DatabaseMeta();

    getInfo(database);
    String[] remarks = database.checkParameters();
    String message = "";

    if (remarks.length != 0) {
      for (int i = 0; i < remarks.length; i++)
        message = message.concat("* ").concat(remarks[i]).concat(System.getProperty("line.separator"));
    }
    else {
      message = database.testConnection();
    }
    showMessage(message,message.length() > 300);
  }

?

showMessage()方法,将打开提示对话框

 private void showMessage(String message,boolean scroll) {
    try {
      XulMessageBox box = (XulMessageBox)this.document.createElement("messagebox"


);
      box.setMessage(message);
      box.setModalParent(((XulRoot)this.document.getElementById("general-datasource-window")).getRootObject());
      if (scroll) {
        box.setScrollable(true);
        box.setWidth(500);
        box.setHeight(400);
      }
      box.open();
    } catch (XulException e) {
      System.out.println("Error creating messagebox " + e.getMessage());
    }
  }

?

上面代码中的"messagebox"生成的组件,就是SwtMessageBox的实例。从上面看到没有指定SwtMessageBox的title, 所以SwtMessageBox就使用了默认标题。

 public String getTitle() {
    if (this.title == null) {
      return "Message:";



    }
    return this.title;
  }

?

如果没有指定Button,就显示ok按钮。

  private DialogButton[] defaultButtons = { DialogButton.ACCEPT };
  private Object[] buttons = this.defaultButtons;
源网站地址:http://cleaneyes.javaeye.com/category/117059?show_full=true

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读