/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.transformation.ui.wizards.xmlfile.panels; import java.util.ArrayList; import java.util.Collection; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.MenuManager; 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.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Group; import org.teiid.designer.query.proc.ITeiidXmlFileInfo; import org.teiid.designer.transformation.ui.Messages; import org.teiid.designer.transformation.ui.UiConstants; import org.teiid.designer.transformation.ui.UiPlugin; import org.teiid.designer.transformation.ui.wizards.xmlfile.TeiidXmlFileInfo; import org.teiid.designer.transformation.ui.wizards.xmlfile.TeiidXmlImportXmlConfigurationPage; import org.teiid.designer.transformation.ui.wizards.xmlfile.XmlAttribute; import org.teiid.designer.transformation.ui.wizards.xmlfile.XmlElement; import org.teiid.designer.ui.common.tree.AbstractTreeContentProvider; import org.teiid.designer.ui.common.util.WidgetFactory; /** * @since 8.0 */ public class XmlFileContentsGroup { TreeViewer xmlTreeViewer; Action createColumnAction, setRootPathAction; ColumnsInfoPanel columnsInfoPanel; final TeiidXmlImportXmlConfigurationPage configPage; public XmlFileContentsGroup(Composite parent, TeiidXmlImportXmlConfigurationPage configPage) { super(); this.configPage = configPage; createPanel(parent); } private TeiidXmlFileInfo getFileInfo() { return configPage.getFileInfo(); } public void setColumnsInfoPanel(ColumnsInfoPanel columnsInfoPanel) { this.columnsInfoPanel = columnsInfoPanel; } public void loadFileContentsViewer() { this.xmlTreeViewer.setInput(this.configPage.getFileInfo()); this.columnsInfoPanel.refresh(); } private void createPanel(Composite parent) { Group fileContentsGroup = WidgetFactory.createGroup(parent, Messages.XmlFileContents, SWT.NONE, 1, 4); GridData gd = new GridData(GridData.FILL_BOTH); gd.heightHint = 400; fileContentsGroup.setLayoutData(gd); this.xmlTreeViewer = new TreeViewer(fileContentsGroup, SWT.BORDER | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); GridData data = new GridData(GridData.FILL_BOTH); data.horizontalSpan=4; this.xmlTreeViewer.getControl().setLayoutData(data); this.xmlTreeViewer.setContentProvider(new AbstractTreeContentProvider() { @Override public Object[] getChildren( Object element ) { return getNodeChildren(element); } @Override public Object getParent( Object element ) { return getNodeParent(element); } @Override public boolean hasChildren( Object element ) { return getNodeHasChildren(element); } }); this.xmlTreeViewer.setLabelProvider(new LabelProvider() { @Override public Image getImage( Object element ) { return getNodeImage(element); } @Override public String getText( Object element ) { return getNodeName(element); } }); // Add a Context Menu final MenuManager columnMenuManager = new MenuManager(); this.xmlTreeViewer.getControl().setMenu(columnMenuManager.createContextMenu(parent)); this.xmlTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() { /** * {@inheritDoc} * * @see oblafond@redhat.comrg.eclipse.jface.viewers.IcreateColumnSelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent) */ @Override public void selectionChanged( final SelectionChangedEvent event ) { columnMenuManager.removeAll(); IStructuredSelection sel = (IStructuredSelection)xmlTreeViewer.getSelection(); if (sel.size() > 0) { columnMenuManager.add(createColumnAction); columnMenuManager.add(setRootPathAction); columnsInfoPanel.notifySelection(true); } else { columnsInfoPanel.notifySelection(false); } } }); this.xmlTreeViewer.addDoubleClickListener(new IDoubleClickListener() { @Override public void doubleClick(DoubleClickEvent event) { IStructuredSelection selection = (IStructuredSelection) event.getSelection(); if (selection != null && !selection.isEmpty() && selection.size() == 1 ) { createColumn(); } } }); this.createColumnAction = new Action(Messages.CreateColumn) { @Override public void run() { createColumn(); } }; this.setRootPathAction = new Action(Messages.SetAsRootPath) { @Override public void run() { setRootPath(); } }; } private void setRootPath() { IStructuredSelection sel = (IStructuredSelection)xmlTreeViewer.getSelection(); Object obj = sel.getFirstElement(); if( obj instanceof XmlElement ) { String pathValue = ((XmlElement)obj).getFullPath(); getFileInfo().setRootPath(pathValue); configPage.handleInfoChanged(false); } } public void createColumn() { IStructuredSelection sel = (IStructuredSelection)xmlTreeViewer.getSelection(); boolean changed = false; for( Object obj : sel.toList() ) { if( obj instanceof XmlElement || obj instanceof XmlAttribute ) { getFileInfo().addNewColumn(obj); changed = true; } } if( changed ) this.configPage.handleInfoChanged(false); } Object[] getNodeChildren( Object element ) { if (element instanceof ITeiidXmlFileInfo) { return new Object[] {getFileInfo().getRootNode()}; } Collection<Object> children = new ArrayList<Object>(); for( Object attr : ((XmlElement)element).getAttributes()) { children.add(attr); } for( Object elem : ((XmlElement)element).getChildrenDTDElements()) { children.add(elem); } return children.toArray(new Object[0]); } boolean getNodeHasChildren( Object element ) { if( element instanceof XmlElement) { XmlElement node = (XmlElement)element; Object[] children = node.getChildrenDTDElements(); Object[] attributes = node.getAttributes(); return (children.length + attributes.length) > 0; } return false; } Image getNodeImage( Object element ) { if( element instanceof XmlAttribute) { return UiPlugin.getDefault().getImage(UiConstants.Images.SCHEMA_ATTRIBUTE); } if( element instanceof XmlElement ) { return UiPlugin.getDefault().getImage(UiConstants.Images.SCHEMA_ELEMENT); } return null; } String getNodeName( Object element ) { if( element instanceof XmlElement ) { XmlElement node = (XmlElement)element; return node.getName(); } if( element instanceof XmlAttribute) { XmlAttribute node = (XmlAttribute)element; return node.getName(); } return ""; //$NON-NLS-1$ } Object getNodeParent( Object element ) { return ((XmlElement)element).getParent(); } }