All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.extra.xtt.gui.model.ProfilingTreeNode Maven / Gradle / Ivy

The newest version!
/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package de.extra.xtt.gui.model;

import java.util.Enumeration;
import java.util.NoSuchElementException;
import java.util.Vector;

import javax.swing.tree.TreeNode;

import de.extra.xtt.util.schema.SchemaElement;
import de.extra.xtt.util.tools.Configurator;

/**
 * TreeNode zur Verwendung im ProfilingTreeModel; das Knoten-Objekt
 * repräsentiert ein Schema-Element und besitzt Eigenschaften wie minOccurs,
 * maxOccurs usw.
 * 
 * @author Beier
 */
public class ProfilingTreeNode implements TreeNode {

	private final SchemaElement schemaElement;
	private final boolean belongsToChoice;
	private final boolean belongsToSequence;
	private final boolean belongsToWildcard;
	private final boolean hasReferenzExtern;
	private final boolean isLocalElement;
	private final int minOccursDefault;
	private final int maxOccursDefault;

	private ProfilingTreeNode parent;
	private Vector children;
	private boolean isChecked;
	private int minOccursUser;
	private int maxOccursUser;

	/**
	 * Konstruktor mit allen relevanten Eigenschaften des anzulegenden
	 * Knoten-Objekts.
	 * 
	 * @param schemaElement
	 *            SchemaElement, f�r das das Knoten-Objekt erzeugt wird
	 * @param minOccurs
	 *            minOccurs-Angabe aus dem Schema
	 * @param maxOccurs
	 *            maxOccurs-Angabe aus dem Schema
	 * @param belongsToChoice
	 *            Gibt an, ob der Knoten Element einer choice-Gruppe ist
	 * @param belongsToSequqence
	 *            Gibt an, ob der Knoten Element einer sequence-Gruppe ist
	 * @param belongsToWildcard
	 *            Gibt an, ob der Knoten Element einer wildcard ist
	 * @param checkAll
	 *            Gibt an, ob die Knoten standardm��ig selektiert sind
	 * @param hasRefrenzExtern
	 *            Gibt an, ob der Knoten eine Referenz auf einen Knoten aus
	 *            einem anderen TreeModel besitzt
	 * @param isLocalElement
	 *            Gibt an, ob das Element im Schema lokal definiert ist
	 * @param parent
	 *            Vaterknoten des zu erstellenden Knotens
	 */
	public ProfilingTreeNode(SchemaElement schemaElement, int minOccurs,
			int maxOccurs, boolean belongsToChoice, boolean belongsToSequqence,
			boolean belongsToWildcard, boolean checkAll,
			boolean hasRefrenzExtern, boolean isLocalElement,
			ProfilingTreeNode parent) {
		this.schemaElement = schemaElement;
		this.minOccursDefault = minOccurs;
		this.maxOccursDefault = maxOccurs;
		this.minOccursUser = minOccurs;
		this.maxOccursUser = maxOccurs;
		this.belongsToChoice = belongsToChoice;
		this.belongsToSequence = belongsToSequqence;
		this.belongsToWildcard = belongsToWildcard;
		this.hasReferenzExtern = hasRefrenzExtern;
		this.isLocalElement = isLocalElement;
		this.parent = parent;
		if (!isOptional()) {
			this.isChecked = true;
		}
		if (checkAll && isOptional()) {
			this.isChecked = true;
		}
	}

	/**
	 * Pr�ft, ob die Kind-Knoten des aktuellen Knotens dem �bergebenenen
	 * Schema-Element entsprechen und gibt ggf. diesen Knd-Knoten zur�ck.
	 * 
	 * @param schemaElement
	 *            SchemaElement, auf das die Kind-Knoten gepr�ft werden
	 * @return TreeNode, der dem SchemaElement entpricht
	 */
	public ProfilingTreeNode getChildWithSameSchemaElement(
			SchemaElement schemaElement) {
		for (Enumeration e = this.children(); e
				.hasMoreElements();) {
			ProfilingTreeNode currNode = e.nextElement();
			if (schemaElement.equals(currNode.getSchemaElement())) {
				return currNode;
			}
		}
		return null;
	}

	/**
	 * {@inheritdoc}
	 */
	@Override
	public Enumeration children() {
		if (children == null) {
			Enumeration childs = new Enumeration() {
				@Override
				public boolean hasMoreElements() {
					return false;
				}

				@Override
				public ProfilingTreeNode nextElement() {
					throw new NoSuchElementException("Keine Elemente vorhanden");
				}
			};
			return childs;
		} else {
			return children.elements();
		}
	}

	/**
	 * F�gt eine Liste von TreeNodes als Kind-Elemente diesem Knoten hinzu
	 * 
	 * @param children
	 */
	public void addChildren(Vector children) {
		this.children = children;
	}

	/**
	 * {@inheritdoc}
	 */
	@Override
	public boolean getAllowsChildren() {
		return true;
	}

	/**
	 * {@inheritdoc}
	 */
	@Override
	public ProfilingTreeNode getChildAt(int childIndex) {
		if (children == null) {
			throw new ArrayIndexOutOfBoundsException("Knoten hat keine Kinder");
		}
		return children.elementAt(childIndex);
	}

	/**
	 * {@inheritdoc}
	 */
	@Override
	public int getChildCount() {
		if (children == null) {
			return 0;
		} else {
			return children.size();
		}
	}

	/**
	 * {@inheritdoc}
	 */
	@Override
	public int getIndex(TreeNode aChild) {
		if (aChild == null) {
			throw new IllegalArgumentException("argument is null");
		}

		if (!isNodeChild(aChild)) {
			return -1;
		}
		return children.indexOf(aChild); // linear search
	}

	/**
	 * {@inheritdoc}
	 */
	@Override
	public ProfilingTreeNode getParent() {
		return parent;
	}

	/**
	 * Gibt die minOccurs-Eigenschaft zur�ck, die im Schema f�r dieses Element
	 * spezifiziert ist
	 * 
	 * @return minOccurs-Eigenschaft, die im Schema f�r dieses Element
	 *         spezifiziert ist
	 */
	public int getMinOccursDefault() {
		return minOccursDefault;
	}

	/**
	 * Gibt die minOccurs-Eigenschaft zur�ck, die vom Benutzer angepasst werden
	 * kann
	 * 
	 * @return minOccurs-Eigenschaft, die vom Benutzer angepasst werden kann
	 */
	public int getMinOccursUser() {
		return minOccursUser;
	}

	/**
	 * Gibt die maxOccurs-Eigenschaft zur�ck, die im Schema f�r dieses Element
	 * spezifiziert ist
	 * 
	 * @return maxOccurs-Eigenschaft, die im Schema f�r dieses Element
	 *         spezifiziert ist
	 */
	public int getMaxOccursDefault() {
		return maxOccursDefault;
	}

	/**
	 * Gibt die maxOccurs-Eigenschaft zur�ck, die vom Benutzer angepasst werden
	 * kann
	 * 
	 * @return maxOccurs-Eigenschaft, die vom Benutzer angepasst werden kann
	 */
	public int getMaxOccursUser() {
		return maxOccursUser;
	}

	/**
	 * Setzt die parent-Eigenschaft des aktuellen Knotens auf das �bergebene
	 * Knoten-Objekt
	 * 
	 * @param parent
	 *            Knoten-Objekt
	 * 
	 */
	public void setParent(ProfilingTreeNode parent) {
		this.parent = parent;
	}

	/**
	 * Entfernt den angegebenen Kind-Knoten, falls vorhanden
	 * 
	 * @param nodeChild
	 *            Kind-Knoten, der entfernt werden soll
	 */
	public void removeChild(ProfilingTreeNode nodeChild) {
		if (nodeChild != null) {
			this.children.remove(nodeChild);
			nodeChild.setParent(null);
		}
	}

	/**
	 * Liefert die SchemaElement-Eigenschaft dieses Knotens zur�ck
	 * 
	 * @return SchemaElement-Eigenschaft des Knotens
	 */
	public SchemaElement getSchemaElement() {
		return schemaElement;
	}

	/**
	 * {@inheritdoc}
	 */
	@Override
	public boolean isLeaf() {
		return (getChildCount() == 0);
	}

	/**
	 * Gibt an, ob es sich bei dem Knoten um das Wurzelelement der
	 * referenzierten Elemente handelt
	 * 
	 * @param configurator
	 *            Konfiguratorobjekt mit Zugriff auf Properties und
	 *            Einstellungen
	 * 
	 * @return true, falls Wurzelelement der referenzierten Elemente
	 */
	public boolean isRootReferencedElements(Configurator configurator) {
		return schemaElement
				.getNameWithPrefix()
				.equals(configurator
						.getResString("XSDCREATORCTRL_TEXT_MEHRFACH_REF_ELEMENTE"));
	}

	/**
	 * Erzeugt einen Info-String f�r den aktuellen Knoten mit Angaben zur
	 * Gruppenzugeh�rigkeit (sequence / choice), minOccurs und maxOccurs
	 * 
	 * @return Info-Text
	 */
	public String getInfoEigenschaften() {
		String infoText = "";
		if (belongsToChoice) {
			infoText += "choice";
		} else if (belongsToSequence) {
			infoText += "sequence";
		}
		if (belongsToWildcard) {
			infoText += " (any)";
		}
		if (minOccursDefault >= 0) {
			infoText += " / minOccurs=" + minOccursDefault;
		}
		if (maxOccursUser >= 0) {
			if (maxOccursUser == Integer.MAX_VALUE) {
				infoText += " / maxOccurs=unbounded";
			} else {
				infoText += " / maxOccurs=" + maxOccursUser;
			}
		}
		return infoText;
	}

	/**
	 * Gibt an, ab der aktuelle Knoten laut Schemadefinition optional ist.
	 * 
	 * @return true, falls der Knoten optional ist, sonst
	 *         false
	 */
	public boolean isOptional() {
		return (!belongsToWildcard && ((minOccursDefault == 0) || belongsToChoice));
	}

	/**
	 * Gibt an, ob der aktuelle Knoten Teil einer Wildcard ('any') ist
	 * 
	 * @return true, falls Knoten Unterelement von 'any', sonst
	 *         false
	 */
	public boolean belongsToWildcard() {
		return belongsToWildcard;
	}

	/**
	 * Gibt an, ob der Wert f�r minOccurs ge�ndert werden darf
	 * 
	 * @return true, falls �nderung m�glich, sonst
	 *         false
	 */
	public boolean isMinOccursChangeable() {
		return (!belongsToWildcard && (belongsToChoice || belongsToSequence));
	}

	/**
	 * Gibt an, ob der Wert f�r maxOccurs ge�ndert werden darf
	 * 
	 * @return true, falls �nderung m�glich, sonst
	 *         false
	 */
	public boolean isMaxOccursChangeable() {
		return (!belongsToWildcard && (belongsToChoice || belongsToSequence));
	}

	/**
	 * Gibt an, ob der Knoten selektiert ist
	 * 
	 * @return true, falls selektiert, sonst false
	 */
	public boolean isChecked() {
		return isChecked;
	}

	/**
	 * Setzt den Selektionsstatus des Knotens
	 * 
	 * @param isChecked
	 *            Gibt an, ob der Knoten selektiert werden soll oder nicht
	 */
	public void setChecked(boolean isChecked) {
		this.isChecked = isChecked;
	}

	/**
	 * Setzt den Wert f�r die minOccurs-Eigenschaft, die der Bneutzer �ndern
	 * darf
	 * 
	 * @param value
	 *            neuer Wert f�r die minOccurs-Eigenschaft, die vom Benutzer
	 *            �nderbar ist
	 */
	public void setMinOccurUser(int value) {
		this.minOccursUser = value;
	}

	/**
	 * Setzt den Wert f�r die maxOccurs-Eigenschaft, die der Bneutzer �ndern
	 * darf
	 * 
	 * @param value
	 *            neuer Wert f�r die maxOccurs-Eigenschaft, die vom Benutzer
	 *            �nderbar ist
	 */
	public void setMaxOccurUser(int value) {
		this.maxOccursUser = value;
	}

	/**
	 * Gibt an, ob der Knoten eine Refrenz auf einen Knoten au�erhalb dieses
	 * TreeModels besitzt.
	 * 
	 * @return true, falls extrene Referenz vorhanden ist, sonst
	 *         false
	 */
	public boolean hasReferenzExtern() {
		return hasReferenzExtern;
	}

	/**
	 * Gibt an, ob das Element dieses Knotens im Schema lokal definiert wird
	 * 
	 * @return true: Element wird lokal definiert;
	 *         false: Referenz
	 */
	public boolean isLocalElement() {
		return isLocalElement;
	}

	/**
	 * {@inheritdoc}
	 */
	@Override
	public String toString() {
		return schemaElement.getName();
	}

	/**
	 * Gibt an, ob der �bergebene Knoten ein Kind-Objekt des aktuellen Knotens
	 * ist
	 * 
	 * @param aNode
	 *            Knotenobjekt, das mit den Kindknoten verglichen wird
	 * @return true, falls das angegebene Knoten-Objekt Kindknoten
	 *         vom aktuellen Knoten ist; sonst false
	 */
	private boolean isNodeChild(TreeNode aNode) {
		boolean retval;

		if (aNode == null) {
			retval = false;
		} else {
			if (getChildCount() == 0) {
				retval = false;
			} else {
				retval = (aNode.getParent() == this);
			}
		}
		return retval;
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy