
package wicket.examples.frames;

import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeModel;

import wicket.MarkupContainer;
import wicket.Page;
import wicket.PageMap;
import wicket.markup.html.WebPage;
import wicket.markup.html.link.BookmarkablePageLink;
import wicket.markup.html.link.Link;
import wicket.markup.html.tree.Tree;
import wicket.markup.html.tree.DefaultAbstractTree.LinkType;

/**
 * The left frame. This page is not bookmarkable, but it's instance is created
 * by {@link wicket.examples.frames.BodyFrame} and hold in the same page map as
 * index. It uses the frameTarget object as a shared model; this page updates
 * that model, and as the Index uses that to set the frame tag, any changes to
 * it should be reflected with the next render.
 * 
 * @author Eelco Hillenius
 */
public class LeftFrame extends WebPage
{
	/**
	 * Link that, when clicked, changes the frame target's frame class (and as
	 * that is a shared model which is also being used by the 'master page'
	 * {@link BodyFrame}, changes are immediately reflected) and set the
	 * response page to the top level page {@link BodyFrame}. Tags that use
	 * this link should have a <code>target="_parent"</code> attribute, so
	 * that the top frame will be refreshed.
	 */
	private static final class ChangeFramePageLink extends Link
	{
		private static final long serialVersionUID = 1L;

		/** parent frame class. */
		private final BodyFrame bodyFrame;

		/** this link's target. */
		private final Class< ? extends Page> pageClass;

		/**
		 * Construct.
		 * 
		 * @param parent
		 * @param id
		 * @param bodyFrame
		 * @param pageClass
		 */
		public ChangeFramePageLink(final MarkupContainer parent, final String id, final BodyFrame bodyFrame,
				final Class< ? extends Page> pageClass)
		{
			super(parent, id);
			this.bodyFrame = bodyFrame;
			this.pageClass = pageClass;
		}

		/**
		 * @see wicket.markup.html.link.Link#onClick()
		 */
		@Override
		public void onClick()
		{
			// change frame class
			bodyFrame.getFrameTarget().setFrameClass(pageClass);

			// trigger re-rendering of the page
			setResponsePage(bodyFrame);
		}
	}
	private static final long serialVersionUID = 1L;

	/**
	 * Constructor
	 * 
	 * @param index
	 *            parent frame class
	 */
	public LeftFrame(final BodyFrame index)
	{
		new ChangeFramePageLink(this, "linkToPage1", index, Page1.class);
		new ChangeFramePageLink(this, "linkToPage2", index, Page2.class);
		BookmarkablePageLink link = new BookmarkablePageLink(this, "directLink", Index.class);
		link.setPageMap(PageMap.forName(BodyFrame.RIGHT_FRAME_NAME));
		
		DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("<root>");
		TreeModel treeModel = new DefaultTreeModel(rootNode);
		
		DefaultMutableTreeNode child = new DefaultMutableTreeNode("Page1");
		rootNode.add(child);
		child = new DefaultMutableTreeNode("Page2");
		rootNode.add(child);
		
		Tree menuTree = new Tree(this, "tree",treeModel)
		{
			@Override
			protected MarkupContainer newNodeLink(MarkupContainer parent,java.lang.String id,javax.swing.tree.TreeNode node)
			{
				BookmarkablePageLink link;
				if (node.toString().equals("Page1"))
					link = new BookmarkablePageLink(parent, id, Page1.class);
				else
					link = new BookmarkablePageLink(parent, id, Page2.class);
				link.setPageMap(PageMap.forName(BodyFrame.RIGHT_FRAME_NAME));
//				link.add(new AttributeModifier("target", new Model<String>(BodyFrame.RIGHT_FRAME_NAME)));
				return link;
			}	
		};
	}

	/**
	 * No need for versioning this frame.
	 * 
	 * @see wicket.Component#isVersioned()
	 */
	@Override
	public boolean isVersioned()
	{
		return false;
	}
}