/*
 * #%L
 * =====================================================
 *   _____                _     ____  _   _       _   _
 *  |_   _|_ __ _   _ ___| |_  / __ \| | | | ___ | | | |
 *    | | | '__| | | / __| __|/ / _` | |_| |/ __|| |_| |
 *    | | | |  | |_| \__ \ |_| | (_| |  _  |\__ \|  _  |
 *    |_| |_|   \__,_|___/\__|\ \__,_|_| |_||___/|_| |_|
 *                             \____/
 * 
 * =====================================================
 * 
 * Hochschule Hannover
 * (University of Applied Sciences and Arts, Hannover)
 * Faculty IV, Dept. of Computer Science
 * Ricklinger Stadtweg 118, 30459 Hannover, Germany
 * 
 * Email: trust@f4-i.fh-hannover.de
 * Website: http://trust.f4.hs-hannover.de/
 * 
 * This file is part of visitmeta-visualization, version 0.6.0,
 * implemented by the Trust@HsH research group at the Hochschule Hannover.
 * %%
 * Copyright (C) 2012 - 2016 Trust@HsH
 * %%
 * Licensed 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.
 * #L%
 */
package de.hshannover.f4.trust.visitmeta.gui.util;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;

import de.hshannover.f4.trust.visitmeta.interfaces.connections.DataserviceConnection;
import de.hshannover.f4.trust.visitmeta.interfaces.data.Data;

public class RESTConnectionModel implements TreeModel {

	private Set<TreeModelListener> mTreeModelListeners;

	private Dataservices mRootNode;

	private boolean mOnlyActiveMapServerConnections;

	private boolean mOnlyActiveSubscriptions;

	private RESTConnectionModel() {
		mTreeModelListeners = new HashSet<TreeModelListener>();
	}

	public RESTConnectionModel(List<DataserviceConnection> dataserviceList) {
		this();
		mRootNode = new Dataservices();
		mRootNode.mList = dataserviceList;
	}

	public void updateConnections(List<DataserviceConnection> graphNodes) {
		Dataservices oldRoot = mRootNode;

		mRootNode = new Dataservices();
		mRootNode.mList = graphNodes;

		fireTreeStructureChanged(oldRoot);
	}

	protected void fireTreeStructureChanged(Object oldRoot) {
		TreeModelEvent e = new TreeModelEvent(this, new Object[] {oldRoot});
		for (TreeModelListener tml : mTreeModelListeners) {
			tml.treeStructureChanged(e);
		}
	}

	public void showAllMapServerConnections(boolean b) {
		mOnlyActiveMapServerConnections = b;
	}

	public void showAllSubscriptions(boolean b) {
		mOnlyActiveSubscriptions = b;
	}

	public boolean isOnlyActiveMapServerConnections() {
		return mOnlyActiveMapServerConnections;
	}

	public boolean isOnlyActiveSubscriptions() {
		return mOnlyActiveSubscriptions;
	}

	@Override
	public void addTreeModelListener(TreeModelListener l) {
		mTreeModelListeners.add(l);
	}

	@Override
	public Object getChild(Object parent, int index) {
		Data element = (Data) parent;
		Data child = element.getSubDataAt(index);
		return child;
	}

	@Override
	public int getChildCount(Object parent) {
		Data element = (Data) parent;
		return element.getSubDataCount();
	}

	@Override
	public int getIndexOfChild(Object parent, Object child) {
		Data element = (Data) parent;
		return element.getIndexOfSubData((Data) child);
	}

	@Override
	public Object getRoot() {
		return mRootNode;
	}

	@Override
	public boolean isLeaf(Object node) {
		Data element = (Data) node;
		return element.getSubDataCount() == 0;
	}

	@Override
	public void removeTreeModelListener(TreeModelListener l) {
		mTreeModelListeners.remove(l);
	}

	@Override
	public void valueForPathChanged(TreePath path, Object newValue) {
		fireTreeStructureChanged(mRootNode);
	}

}
