/*
 * Copyright (C) 2010 - 2012.
 * AHCP Project (http://code.google.com/p/jacp)
 * All rights reserved.
 *
 * 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.
 */
package org.jacp.demo.components;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.scene.Node;
import javafx.scene.control.Button;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jacp.demo.entity.Contact;
import org.jacpfx.api.annotations.Resource;
import org.jacpfx.api.annotations.component.View;
import org.jacpfx.api.annotations.lifecycle.PostConstruct;
import org.jacpfx.api.message.Message;
import org.jacpfx.api.util.ToolbarPosition;
import org.jacpfx.rcp.component.FXComponent;
import org.jacpfx.rcp.componentLayout.FXComponentLayout;
import org.jacpfx.rcp.components.toolBar.JACPToolBar;
import org.jacpfx.rcp.context.JACPContext;
import org.jacpfx.rcp.util.FXUtil.MessageUtil;

/**
 * The ContactTreeViewComponent displays the contact category on the left side
 * of the application; It creates a "add category" button to add new categories
 * to view
 * 
 * @author Andy Moncsek Patrick Symmangk
 */
@View(id = "id001", name = "contactDemoTreeView", active = true,initialTargetLayoutId ="PleftMenu" )
public class ContactTreeViewComponent implements FXComponent {
	private final static Log LOGGER = LogFactory
			.getLog(ContactTreeViewComponent.class);
	private ContactTreeView pane;
	private ObservableList<Contact> contactList;
    @Resource
    private JACPContext context;

	@Override
	/**
	 * handle the component in worker thread
	 */
	public Node handle(final Message<Event, Object> message) throws Exception {
		// on initial message create the layout outside the FXApplication thread
		if (message.isMessageBodyTypeOf(MessageUtil.class) && message.getMessageBody() == (MessageUtil.INIT)) {
			return this.createInitialLayout();
		}
		LOGGER.debug("ContactTreeViewComponent handleAction message: " + message.getMessageBody());
		return null;
	}

	@Override
	/**
	 * handle the component in FX application thread
	 */
	public Node postHandle(final Node node,
			final Message<Event, Object> message) throws Exception {
		// add a new contact in FXApplication thread
        LOGGER.debug("parentId: "+context.getParentId() );
		if (message.isMessageBodyTypeOf(Contact.class)) {
			final Contact contact = message.getTypedMessageBody(Contact.class);
			this.addNewContact(contact);
		}
		return this.pane;
	}

	

	/**
	 * handle menu an toolbar entries on component start up
	 */
	@PostConstruct
	public void PostConstructComponent(final FXComponentLayout layout) {
		final JACPToolBar north = layout
				.getRegisteredToolBar(ToolbarPosition.NORTH);
		final Button add = new Button("add category");
		add.getStyleClass().add("first");
		final ContactTreeViewComponent component = this;
		add.setOnAction(new EventHandler<ActionEvent>() {

			@Override
			public void handle(final ActionEvent event) {
				new ContactAddDialog(component);
			}

		});
		north.add(context.getId(), add);
	}

	private ContactTreeView createInitialLayout() {
		this.contactList = this.getCategoryList();
		this.pane = new ContactTreeView(this.contactList, this);
		return this.pane;
	}

	/**
	 * create dummy category list
	 * 
	 * @return
	 */
	private ObservableList<Contact> getCategoryList() {
		final ObservableList<Contact> categories = FXCollections
				.<Contact> observableArrayList();
		final Contact privateContact = new Contact();
		privateContact.setFirstName("private");
		final Contact publicContact = new Contact();
		publicContact.setFirstName("public");
		final Contact officeContact = new Contact();
		officeContact.setFirstName("office");
		categories.add(privateContact);
		categories.add(publicContact);
		categories.add(officeContact);
		return categories;
	}
	
	private void addNewContact(final Contact contact) {
		this.contactList.add(contact);
	}

    public JACPContext getContext(){
        return this.context;
    }
}

@@ -2427,35 +2427,33 @@
 %0D%0A%09%09if (message.
-isM
+m
 essageBodyTypeOf
@@ -2450,65 +2450,14 @@
 Body
-TypeOf(MessageUtil.class) && message.getMessageBody() == 
+Equals
 (Mes

clean up