testdev/ite/src/com.nokia.testfw.codegen.ui/src/com/nokia/testfw/codegen/ui/preferences/TESTFWTemplatePreferencePage.java
author Johnson Ma <johnson.ma@nokia.com>
Tue, 30 Mar 2010 14:39:29 +0800
changeset 1 96906a986c3b
permissions -rw-r--r--
contribute ITE to symbian foundation

/*
 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
 * All rights reserved.
 * This component and the accompanying materials are made available
 * under the terms of "Eclipse Public License v1.0"
 * which accompanies this distribution, and is available
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
 *
 * Initial Contributors:
 * Nokia Corporation - initial contribution.
 *
 * Contributors:
 *
 * Description: 
 *
 */
package com.nokia.testfw.codegen.ui.preferences;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.Collator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import org.eclipse.cdt.internal.ui.editor.CSourceViewer;
import org.eclipse.cdt.internal.ui.preferences.CSourcePreviewerUpdater;
import org.eclipse.cdt.internal.ui.preferences.CodeTemplateSourceViewerConfiguration;
import org.eclipse.cdt.internal.ui.text.CTextTools;
import org.eclipse.cdt.internal.ui.text.template.TemplateVariableProcessor;
import org.eclipse.cdt.internal.ui.util.PixelConverter;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.source.SourceViewer;
import org.eclipse.jface.text.templates.Template;
import org.eclipse.jface.text.templates.TemplateContextType;
import org.eclipse.jface.text.templates.persistence.TemplatePersistenceData;
import org.eclipse.jface.text.templates.persistence.TemplateReaderWriter;
import org.eclipse.jface.text.templates.persistence.TemplateStore;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.ui.internal.texteditor.NLSUtility;
import org.eclipse.ui.texteditor.templates.TemplatePreferencePage;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.PlatformUI;

import com.nokia.testfw.codegen.ui.CodegenUIPlugin;
import com.nokia.testfw.codegen.templates.TemplateLoader;
import com.nokia.testfw.codegen.ui.Messages;
import com.nokia.testfw.codegen.ui.util.PathNode;
import com.nokia.testfw.codegen.ui.util.PathNodeConverter;

/**
 * This class represents a preference page that is contributed to the
 * Preferences dialog. By subclassing <samp>FieldEditorPreferencePage</samp>, we
 * can use the field support built into JFace that allows us to create a page
 * that is small and knows how to save, restore and apply itself.
 * <p>
 * This page is used to modify preferences only. They are stored in the
 * preference store that belongs to the main plug-in class. That way,
 * preferences can be accessed directly via the preference store.
 */

@SuppressWarnings("restriction")
public class TESTFWTemplatePreferencePage extends TemplatePreferencePage
		implements IWorkbenchPreferencePage {

	private class TESTFWTemplateAdapter implements ITreeContentProvider,
			ISelectionChangedListener, IDoubleClickListener {

		private final Object NO_CHILDREN[];

		TESTFWTemplateAdapter() {
			super();
			NO_CHILDREN = new Object[0];
		}

		public Object[] getChildren(Object obj) {
			if (obj instanceof PathNode)
				return ((PathNode) obj).getChildren();
			else
				return NO_CHILDREN;
		}

		public Object getParent(Object obj) {
			if (obj instanceof PathNode)
				return ((PathNode) obj).getParent();
			else
				return null;
		}

		public boolean hasChildren(Object obj) {
			if (obj instanceof PathNode)
				return ((PathNode) obj).getChildren().length > 0;
			else
				return false;
		}

		public Object[] getElements(Object obj) {
			if (obj instanceof TemplateStore) {
				return convertToPathTree((TemplateStore) obj).getChildren();
			}
			return NO_CHILDREN;
		}

		public void dispose() {
		}

		public void inputChanged(Viewer viewer, Object obj, Object obj1) {
		}

		public void selectionChanged(SelectionChangedEvent selectionchangedevent) {
			updateButtons();
			updateViewerInput();
		}

		public void doubleClick(DoubleClickEvent doubleclickevent) {
			if (canEdit()) {
				edit();
			}
		}
	}

	private static class TESTFWTemplateLabelProvider extends LabelProvider {

		@SuppressWarnings("deprecation")
		public Image getImage(Object obj) {
			if (obj instanceof PathNode) {
				PathNode node = (PathNode) obj;
				if (node.getData() != null) {
					return PlatformUI.getWorkbench().getSharedImages()
							.getImage(ISharedImages.IMG_OBJ_FILE);
				}
				if (node.getParent().getParent() == null) {
					return PlatformUI.getWorkbench().getSharedImages()
							.getImage(ISharedImages.IMG_OBJ_PROJECT);
				} else {
					return PlatformUI.getWorkbench().getSharedImages()
							.getImage(ISharedImages.IMG_OBJ_FOLDER);
				}
			}
			return null;
		}

		public String getText(Object obj) {
			if (obj instanceof PathNode)
				return ((PathNode) obj).getName();
			return null;
		}
	}

	/** The tree presenting the templates. */
	public TreeViewer iTreeViewer;

	/* buttons */
	public Button iAddButton;
	public Button iEditButton;
	public Button iImportButton;
	public Button iExportButton;
	public Button iRemoveButton;
	public Button iRestoreButton;
	public Button iRevertButton;

	private SourceViewer iPatternViewer;
	private TemplateVariableProcessor iTemplateProcessor;

	public TESTFWTemplatePreferencePage() {
		setPreferenceStore(CodegenUIPlugin.getDefault().getPreferenceStore());
		setTemplateStore(CodegenUIPlugin.getDefault().getTemplateStore());
		setContextTypeRegistry(CodegenUIPlugin.getDefault()
				.getContextTypeRegistry());
		iTemplateProcessor = new TemplateVariableProcessor();
	}

	protected boolean isShowFormatterSetting() {
		return false;
	}

	public boolean performOk() {

		boolean ok = super.performOk();

		//CodegenUIPlugin.getDefault().savePluginPreferences();

		return ok;
	}

	protected Control createContents(Composite ancestor) {
		Composite parent = new Composite(ancestor, SWT.NONE);
		GridLayout layout = new GridLayout();
		layout.numColumns = 2;
		layout.marginHeight = 0;
		layout.marginWidth = 0;
		parent.setLayout(layout);

		Composite innerParent = new Composite(parent, SWT.NONE);
		GridLayout innerLayout = new GridLayout();
		innerLayout.numColumns = 2;
		innerLayout.marginHeight = 0;
		innerLayout.marginWidth = 0;
		innerParent.setLayout(innerLayout);
		GridData gd = new GridData(GridData.FILL_BOTH);
		gd.horizontalSpan = 2;
		innerParent.setLayoutData(gd);

		Composite treeComposite = new Composite(innerParent, SWT.NONE);
		GridData data = new GridData(GridData.FILL_BOTH);
		data.widthHint = 360;
		data.heightHint = convertHeightInCharsToPixels(10);
		treeComposite.setLayoutData(data);

		FillLayout treeLayout = new FillLayout();
		treeComposite.setLayout(treeLayout);

		TESTFWTemplateAdapter adapter = new TESTFWTemplateAdapter();

		iTreeViewer = new TreeViewer(treeComposite, SWT.BORDER | SWT.H_SCROLL
				| SWT.V_SCROLL);
		iTreeViewer.setLabelProvider(new TESTFWTemplateLabelProvider());
		iTreeViewer.setContentProvider(adapter);
		iTreeViewer.addSelectionChangedListener(adapter);
		iTreeViewer.addDoubleClickListener(adapter);

		iTreeViewer.setComparator(new ViewerComparator() {
			public int compare(Viewer viewer, Object object1, Object object2) {
				if ((object1 instanceof PathNode)
						&& (object2 instanceof PathNode)) {
					String leftName = ((PathNode) object1).getName();
					String rightName = ((PathNode) object2).getName();
					int result = Collator.getInstance().compare(leftName,
							rightName);
					return result;
				}
				return super.compare(viewer, object1, object2);
			}

			public boolean isSorterProperty(Object element, String property) {
				return true;
			}
		});

		Composite buttons = new Composite(innerParent, SWT.NONE);
		buttons.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
		layout = new GridLayout();
		layout.marginHeight = 0;
		layout.marginWidth = 0;
		buttons.setLayout(layout);

		iAddButton = new Button(buttons, SWT.PUSH);
		iAddButton.setText(Messages.getString("TemplatePreferencePage_new"));
		iAddButton.setLayoutData(new GridData(768));
		iAddButton.addListener(SWT.Selection, new Listener() {
			public void handleEvent(Event e) {
				add();
			}
		});

		iEditButton = new Button(buttons, SWT.PUSH);
		iEditButton.setText(Messages.getString("TemplatePreferencePage_edit"));
		iEditButton.setLayoutData(new GridData(768));
		iEditButton.addListener(SWT.Selection, new Listener() {
			public void handleEvent(Event e) {
				edit();
			}
		});

		iRemoveButton = new Button(buttons, SWT.PUSH);
		iRemoveButton.setText(Messages
				.getString("TemplatePreferencePage_remove"));
		iRemoveButton.setLayoutData(new GridData(768));
		iRemoveButton.addListener(SWT.Selection, new Listener() {
			public void handleEvent(Event e) {
				remove();
			}
		});

		createSeparator(buttons);

		iRestoreButton = new Button(buttons, SWT.PUSH);
		iRestoreButton.setText(Messages
				.getString("TemplatePreferencePage_restore"));
		iRestoreButton.setLayoutData(new GridData(768));
		iRestoreButton.addListener(SWT.Selection, new Listener() {
			public void handleEvent(Event e) {
				restoreDeleted();
			}
		});

		iRevertButton = new Button(buttons, SWT.PUSH);
		iRevertButton.setText(Messages
				.getString("TemplatePreferencePage_revert"));
		iRevertButton.setLayoutData(new GridData(768));
		iRevertButton.addListener(SWT.Selection, new Listener() {
			public void handleEvent(Event e) {
				revert();
			}
		});

		createSeparator(buttons);

		iImportButton = new Button(buttons, SWT.PUSH);
		iImportButton.setText(Messages
				.getString("TemplatePreferencePage_import"));
		iImportButton.setLayoutData(new GridData(768));
		iImportButton.addListener(SWT.Selection, new Listener() {
			public void handleEvent(Event e) {
				import_();
			}
		});

		iExportButton = new Button(buttons, SWT.PUSH);
		iExportButton.setText(Messages
				.getString("TemplatePreferencePage_export"));
		iExportButton.setLayoutData(new GridData(768));
		iExportButton.addListener(SWT.Selection, new Listener() {
			public void handleEvent(Event e) {
				export();
			}
		});

		iPatternViewer = createViewer(parent, 2);

		iTreeViewer.setInput(getTemplateStore());

		updateButtons();
		Dialog.applyDialogFont(parent);
		innerParent.layout();

		return parent;
	}

	private Label createSeparator(Composite parent) {
		Label separator = new Label(parent, 0);
		separator.setVisible(false);
		GridData gd = new GridData();
		gd.horizontalAlignment = 4;
		gd.verticalAlignment = 1;
		gd.heightHint = 4;
		separator.setLayoutData(gd);
		return separator;
	}

	private void add() {

		Iterator<?> it = getContextTypeRegistry().contextTypes();
		if (it.hasNext()) {
			Template template = new Template(
					"", "", ((TemplateContextType) it.next()).getId(), "", true); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$

			Template newTemplate = editTemplate(template, false, true);
			if (newTemplate != null) {
				TemplatePersistenceData data = new TemplatePersistenceData(
						newTemplate, true);
				getTemplateStore().add(data);
				iTreeViewer.refresh();
				iTreeViewer.setSelection(new StructuredSelection(data));
			}
		}
	}

	protected boolean canEdit() {
		IStructuredSelection selection = (IStructuredSelection) iTreeViewer
				.getSelection();

		return (selection.size() == 1 && (((PathNode) selection
				.getFirstElement()).getData() != null));
	}

	private void edit() {
		IStructuredSelection selection = (IStructuredSelection) iTreeViewer
				.getSelection();

		Object[] objects = selection.toArray();
		if ((objects == null) || (objects.length != 1))
			return;

		TemplatePersistenceData data = (TemplatePersistenceData) ((PathNode) selection
				.getFirstElement()).getData();
		if (data != null)
			edit(data);
	}

	private void edit(TemplatePersistenceData data) {
		Template oldTemplate = data.getTemplate();
		Template newTemplate = editTemplate(new Template(oldTemplate), true,
				true);
		if (newTemplate != null) {

			if (!newTemplate.getName().equals(oldTemplate.getName())
					&& MessageDialog
							.openQuestion(
									getShell(),
									Messages
											.getString("TemplatePreferencePage_question_create_new_title"),
									Messages
											.getString("TemplatePreferencePage_question_create_new_message"))) {
				data = new TemplatePersistenceData(newTemplate, true);
				getTemplateStore().add(data);
				iTreeViewer.refresh();
			} else {
				data.setTemplate(newTemplate);
				iTreeViewer.refresh(data);
			}
			selectionChanged();
			iTreeViewer.setSelection(new StructuredSelection(data));
		}
	}

	protected boolean canRemove() {
		IStructuredSelection selection = (IStructuredSelection) iTreeViewer
				.getSelection();

		if (selection.size() == 1
				&& (((PathNode) selection.getFirstElement()).getData() != null)) {
			TemplatePersistenceData data = (TemplatePersistenceData) ((PathNode) selection
					.getFirstElement()).getData();
			return data.isUserAdded();
		} else {
			return false;
		}
	}

	private void remove() {
		IStructuredSelection selection = (IStructuredSelection) iTreeViewer
				.getSelection();

		Iterator<?> elements = selection.iterator();
		while (elements.hasNext()) {
			TemplatePersistenceData data = (TemplatePersistenceData) ((PathNode) elements
					.next()).getData();
			getTemplateStore().delete(data);
		}

		iTreeViewer.refresh();
	}

	private void restoreDeleted() {
		getTemplateStore().restoreDeleted();
		iTreeViewer.refresh();
		updateButtons();
	}

	private void revert() {
		IStructuredSelection selection = (IStructuredSelection) iTreeViewer
				.getSelection();

		Iterator<?> elements = selection.iterator();
		while (elements.hasNext()) {
			TemplatePersistenceData data = (TemplatePersistenceData) ((PathNode) elements
					.next()).getData();
			data.revert();
		}

		selectionChanged();
		iTreeViewer.refresh();
	}

	private void import_() {
		FileDialog dialog = new FileDialog(getShell());
		dialog.setText(Messages
				.getString("TemplatePreferencePage_import_title"));
		dialog.setFilterExtensions(new String[] { Messages
				.getString("TemplatePreferencePage_import_extension") });
		String path = dialog.open();

		if (path == null)
			return;

		try {
			TemplateReaderWriter reader = new TemplateReaderWriter();
			File file = new File(path);
			if (file.exists()) {
				InputStream input = new BufferedInputStream(
						new FileInputStream(file));
				try {
					TemplatePersistenceData[] datas = reader.read(input, null);
					for (int i = 0; i < datas.length; i++) {
						TemplatePersistenceData data = datas[i];
						getTemplateStore().add(data);
					}
				} finally {
					try {
						input.close();
					} catch (IOException x) {
						// ignore
					}
				}
			}

			iTreeViewer.refresh();

		} catch (FileNotFoundException e) {
			openReadErrorDialog();
		} catch (IOException e) {
			openReadErrorDialog();
		}
	}

	private void export() {
		IStructuredSelection selection = (IStructuredSelection) iTreeViewer
				.getSelection();
		Object[] nodes = selection.toArray();

		Set<TemplatePersistenceData> dataSet = new HashSet<TemplatePersistenceData>();
		for (int i = 0; i != nodes.length; i++) {
			dataSet.addAll(getChildrenTemplate((PathNode) nodes[i]));
		}
		export(dataSet.toArray(new TemplatePersistenceData[0]));
	}

	private void export(TemplatePersistenceData[] templates) {
		FileDialog dialog = new FileDialog(getShell(), SWT.SAVE);
		dialog.setText(Messages
				.getString("TemplatePreferencePage_export_title"));
		dialog.setFilterExtensions(new String[] { Messages
				.getString("TemplatePreferencePage_export_extension") });
		dialog.setFileName(Messages
				.getString("TemplatePreferencePage_export_filename"));
		String path = dialog.open();

		if (path == null)
			return;

		File file = new File(path);

		if (file.isHidden()) {
			String title = Messages
					.getString("TemplatePreferencePage_export_error_title");
			String message = NLSUtility.format(Messages
					.getString("TemplatePreferencePage_export_error_hidden"),
					file.getAbsolutePath());
			MessageDialog.openError(getShell(), title, message);
			return;
		}

		if (file.exists() && !file.canWrite()) {
			String title = Messages
					.getString("TemplatePreferencePage_export_error_title");
			String message = NLSUtility
					.format(
							Messages
									.getString("TemplatePreferencePage_export_error_canNotWrite"),
							file.getAbsolutePath());
			MessageDialog.openError(getShell(), title, message);
			return;
		}

		if (!file.exists() || confirmOverwrite(file)) {
			OutputStream output = null;
			try {
				output = new BufferedOutputStream(new FileOutputStream(file));
				TemplateReaderWriter writer = new TemplateReaderWriter();
				writer.save(templates, output);
			} catch (IOException e) {
				openWriteErrorDialog();
			} finally {
				if (output != null) {
					try {
						output.close();
					} catch (IOException e) {
						// ignore
					}
				}
			}
		}
	}

	private boolean confirmOverwrite(File file) {
		return MessageDialog
				.openQuestion(
						getShell(),
						Messages
								.getString("TemplatePreferencePage_export_exists_title"),
						NLSUtility
								.format(
										Messages
												.getString("TemplatePreferencePage_export_exists_message"),
										file.getAbsolutePath()));
	}

	private void openReadErrorDialog() {
		String title = Messages
				.getString("TemplatePreferencePage_error_read_title");
		String message = Messages
				.getString("TemplatePreferencePage_error_read_message");
		MessageDialog.openError(getShell(), title, message);
	}

	/*
	 * @since 3.2
	 */
	private void openWriteErrorDialog() {
		String title = Messages
				.getString("TemplatePreferencePage_error_write_title");
		String message = Messages
				.getString("TemplatePreferencePage_error_write_message");
		MessageDialog.openError(getShell(), title, message);
	}

	private void selectionChanged() {
		updateViewerInput();
		updateButtons();
	}

	/**
	 * Updates the pattern viewer.
	 */
	protected void updateViewerInput() {
		if (iPatternViewer == null
				|| iPatternViewer.getTextWidget().isDisposed())
			return;
		IStructuredSelection selection = (IStructuredSelection) iTreeViewer
				.getSelection();

		if (selection.size() == 1
				&& (((PathNode) selection.getFirstElement()).getData() != null)) {
			TemplatePersistenceData data = (TemplatePersistenceData) ((PathNode) selection
					.getFirstElement()).getData();
			Template template = data.getTemplate();
			TemplateContextType type = CUIPlugin.getDefault()
					.getCodeTemplateContextRegistry().getContextType(
							template.getContextTypeId());
			if (type == null) {
				type = CodegenUIPlugin.getDefault().getContextTypeRegistry()
						.getContextType(template.getContextTypeId());
			}
			iTemplateProcessor.setContextType(type);
			reconfigurePatternViewer();
			iPatternViewer.getDocument().set(template.getPattern());
		} else {
			iPatternViewer.getDocument().set("");
		}

	}

	private SourceViewer createViewer(Composite parent, int nColumns) {
		Label label = new Label(parent, 0);
		label.setText(Messages.getString("TemplatePreferencePage_preview"));
		GridData data = new GridData();
		data.horizontalSpan = nColumns;
		label.setLayoutData(data);
		IDocument document = new Document();
		CTextTools tools = CUIPlugin.getDefault().getTextTools();
		tools.setupCDocumentPartitioner(document, "___c_partitioning", null);
		org.eclipse.jface.preference.IPreferenceStore store = CUIPlugin
				.getDefault().getCombinedPreferenceStore();
		SourceViewer viewer = new CSourceViewer(parent, null, null, false,
				2816, store);
		CodeTemplateSourceViewerConfiguration configuration = new CodeTemplateSourceViewerConfiguration(
				tools.getColorManager(), store, null, iTemplateProcessor);
		viewer.configure(configuration);
		viewer.setEditable(false);
		viewer.setDocument(document);
		org.eclipse.swt.graphics.Font font = JFaceResources
				.getFont("org.eclipse.cdt.ui.editors.textfont");
		viewer.getTextWidget().setFont(font);
		new CSourcePreviewerUpdater(viewer, configuration, store);
		Control control = viewer.getControl();
		data = new GridData(1296);
		data.horizontalSpan = nColumns;
		data.heightHint = new PixelConverter(parent)
				.convertHeightInCharsToPixels(5);
		control.setLayoutData(data);
		return viewer;
	}

	private void reconfigurePatternViewer() {
		if (iPatternViewer == null) {
			return;
		} else {
			CTextTools tools = CUIPlugin.getDefault().getTextTools();
			org.eclipse.jface.preference.IPreferenceStore store = CUIPlugin
					.getDefault().getCombinedPreferenceStore();
			CodeTemplateSourceViewerConfiguration configuration = new CodeTemplateSourceViewerConfiguration(
					tools.getColorManager(), store, null, iTemplateProcessor);
			iPatternViewer.unconfigure();
			iPatternViewer.configure(configuration);
			iPatternViewer.invalidateTextPresentation();
			return;
		}
	}

	/**
	 * Updates the buttons.
	 */
	protected void updateButtons() {
		IStructuredSelection selection = (IStructuredSelection) iTreeViewer
				.getSelection();
		int selectionCount = selection.size();
		boolean canRestore = getTemplateStore().getTemplateData(true).length != getTemplateStore()
				.getTemplateData(false).length;
		boolean canRevert = false;
		TemplatePersistenceData data = null;
		for (Iterator<?> it = selection.iterator(); it.hasNext();) {
			data = (TemplatePersistenceData) ((PathNode) it.next()).getData();
			if (data != null && data.isModified()) {
				canRevert = true;
				break;
			}
		}

		iEditButton.setEnabled(selectionCount == 1 && data != null);
		iExportButton.setEnabled(selectionCount > 0);
		iRemoveButton.setEnabled(selectionCount > 0);
		iRestoreButton.setEnabled(canRestore);
		iRevertButton.setEnabled(canRevert);
	}

	private PathNode convertToPathTree(TemplateStore aTemplateStore) {
		PathNode root = new PathNode(TemplateLoader.TEMPLATES_DIR);
		TemplatePersistenceData[] lTemplateDataArray = aTemplateStore
				.getTemplateData(false);

		for (TemplatePersistenceData data : lTemplateDataArray) {
			String path = data.getTemplate().getDescription();
			PathNode node = PathNodeConverter.pathToNode(root, path);
			node.setData(data);
		}
		return root;
	}

	private Set<TemplatePersistenceData> getChildrenTemplate(PathNode parent) {
		Set<TemplatePersistenceData> templates = new HashSet<TemplatePersistenceData>();
		if (parent.getData() != null) {
			templates.add((TemplatePersistenceData) parent.getData());
		} else {
			for (PathNode child : parent.getChildren()) {
				if (child.getData() != null) {
					templates.add((TemplatePersistenceData) child.getData());
				} else {
					templates.addAll(getChildrenTemplate(child));
				}
			}
		}
		return templates;
	}
}