XML (E4X) のデータを JTreeで表示してみる

Rhinoの, XML (E4X) の属性のチェックが以前の方法では対処できなくなったので, そのメモ みたいな。前は if (data.@src == undefined) {} て感じで判断できたけど, 今のは無理。もちろん if (data.@src) {} てのも無理。

/* Tree view *//*
*/
importPackage(Packages.javax.swing, java.awt)
importPackage(Packages.javax.swing.tree)
importClass(Packages.javax.swing.table.AbstractTableModel)

/* データを読み込む */
var file = arguments.length > 0? arguments[0]: 'TreeData.ser'
var xmlRoot = new XML(deserialize(file))

function createComponents() {
  function setRoot(root) { return function () { return root } }
  var treeRoot = setRoot(xmlRoot)

  var treeModel = new TreeModel() {
    getChild: function (parent, index) { return parent.*[index] },
    getChildCount: function (parent) { return parent.*.length() },
    getIndexOfChild: function (parent, child) { return child.childIndex() },
    getRoot: treeRoot,
    isLeaf: function (node) { return node.hasSimpleContent() },
    //addTreeModelListener: function (l) {},
    //removeTreeModelListener: function (l) {},
    valueForPathChanged: function (path, newValue) {
      print(path, newValue)
    },
  }
  var tree = new JTree(treeModel)

  tree.cellRenderer = new JavaAdapter(DefaultTreeCellRenderer, {
    getTreeCellRendererComponent: function (tree, value, sel, expanded, leaf, row, hasFocus) {
      var n = value.hasComplexContent()? value.name(): value.@src
      this.super$getTreeCellRendererComponent(tree, n, sel, expanded, leaf, row, hasFocus)
      return this
    },
  })

  var pane = new JPanel()
  pane.add(new JScrollPane(tree))
  return pane
}

function main() {
  try {
    UIManager.setLookAndFeel(UIManager.systemLookAndFeelClassName)
    //UIManager.setLookAndFeel(UIManager.crossPlatformLookAndFeelClassName)
  } catch (e) {}

  var frame = new JFrame('Tree View')
  frame.defaultCloseOperation = JFrame.EXIT_ON_CLOSE
  frame.contentPane.add(createComponents())
  frame.pack()
  frame.visible = true
}

main()