/*
 * File    : JDomTreeObject.java
 * Created : 05-dec-2002 11:19
 * By      : fbusquets
 *
 * JClic - Authoring and playing system for educational activities
 *
 * Copyright (C) 2000 - 2018 Francesc Busquets & Departament
 * d'Educacio de la Generalitat de Catalunya
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details (see the LICENSE file).
 */

package edu.xtec.util;

import java.util.Iterator;
import javax.swing.table.AbstractTableModel;
import javax.swing.tree.DefaultMutableTreeNode;

/**
 * @author Francesc Busquets (fbusquets@xtec.cat)
 * @version 13.08.09
 */
public class JDomTreeObject extends AbstractTableModel {

  org.jdom.Element element;
  Options options;

  JDomTreeObject(org.jdom.Element element, Options options) {
    super();
    this.element = element;
    this.options = options;
  }

  @Override
  public String getColumnName(int column) {
    return options.getMsg(column == 0 ? "XML_ATTRIBUTE" : "XML_VALUE");
  }

  @Override
  public boolean isCellEditable(int rowIndex, int columnIndex) {
    return (columnIndex != 0);
  }

  @Override
  public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    if (aValue == null)
      return;
    if (rowIndex == 0) {
      if (element.getChildren().isEmpty())
        element.setText(aValue.toString());
      else
        options.getMessages().showAlert(options.getMainComponent(), "XML_NOT_EDITABLE");
    } else {
      org.jdom.Attribute atr = (org.jdom.Attribute) element.getAttributes().get(rowIndex - 1);
      atr.setValue(aValue.toString());
    }
  }

  public int getRowCount() {
    return 1 + element.getAttributes().size();
  }

  public int getColumnCount() {
    return 2;
  }

  public Object getValueAt(int row, int column) {
    if (row == 0) {
      return (column == 0 ? options.getMsg("XML_TEXT") : element.getText());
    }
    org.jdom.Attribute atr = (org.jdom.Attribute) element.getAttributes().get(row - 1);
    return (column == 0 ? atr.getName() : atr.getValue());
  }

  @Override
  public String toString() {
    org.jdom.Attribute atr;
    StringBuilder result = new StringBuilder(element.getName());
    if ((atr = element.getAttribute(JDomUtility.NAME)) != null)
      result.append(" ").append(atr.getValue());
    if ((atr = element.getAttribute(JDomUtility.ID)) != null)
      result.append(" - ").append(atr.getValue());
    if ((atr = element.getAttribute(JDomUtility.TYPE)) != null)
      result.append(" - ").append(atr.getValue());
    return result.substring(0);
  }

  public static DefaultMutableTreeNode processNode(DefaultMutableTreeNode parent, org.jdom.Element element,
      Options options) {
    JDomTreeObject te = new JDomTreeObject(element, options);
    DefaultMutableTreeNode node = new DefaultMutableTreeNode(te);
    Iterator iter = element.getChildren().iterator();
    while (iter.hasNext()) {
      processNode(node, (org.jdom.Element) iter.next(), options);
    }
    if (parent != null)
      parent.add(node);
    return node;
  }

  /**
   * Getter for property element.
   *
   * @return Value of property element.
   */
  public org.jdom.Element getElement() {
    return element;
  }
}