[jboss-cvs] jbosside/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/viewproviders ...

Robert Stryker rawblem at gmail.com
Thu Jul 27 02:34:00 EDT 2006


  User: rawb    
  Date: 06/07/27 02:34:00

  Modified:    as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/viewproviders    
                        JBossServerViewExtension.java
                        ModuleViewProvider.java EventLogViewProvider.java
  Added:       as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/viewproviders    
                        DescriptorXPathViewProvider.java
  Log:
  Implemented xpath editor in properties view. Other changes made to fascilitate this implementation (added to DescriptorModel, etc). Also fixed bugs, re-added classpath to server configuration so user can customize.
  
  Revision  Changes    Path
  1.4       +17 -7     jbosside/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/viewproviders/JBossServerViewExtension.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: JBossServerViewExtension.java
  ===================================================================
  RCS file: /cvsroot/jboss/jbosside/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/viewproviders/JBossServerViewExtension.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -b -r1.3 -r1.4
  --- JBossServerViewExtension.java	27 Jun 2006 21:34:36 -0000	1.3
  +++ JBossServerViewExtension.java	27 Jul 2006 06:34:00 -0000	1.4
  @@ -25,16 +25,15 @@
   import org.eclipse.jface.action.IMenuManager;
   import org.eclipse.jface.viewers.ITreeContentProvider;
   import org.eclipse.jface.viewers.LabelProvider;
  +import org.eclipse.swt.widgets.Composite;
   import org.eclipse.swt.widgets.Shell;
   import org.eclipse.ui.views.properties.IPropertySheetPage;
   import org.jboss.ide.eclipse.as.ui.JBossServerUIPlugin.ServerViewProvider;
  +import org.jboss.ide.eclipse.as.ui.preferencepages.ViewProviderPreferenceComposite;
   import org.jboss.ide.eclipse.as.ui.views.JBossServerView;
   
   public abstract class JBossServerViewExtension {
   	protected ServerViewProvider provider;
  -	public static final int PROPERTIES = 1;
  -	public static final int TEXT = 2;
  -	public static final int PROPERTIES_AND_TEXT = 3;
   	
   	/**
   	 * Which extension point is mine.
  @@ -65,13 +64,24 @@
   	}
   	
   	
  -	public abstract void fillContextMenu(Shell shell, IMenuManager menu, Object selection);
  +	public void fillContextMenu(Shell shell, IMenuManager menu, Object selection) {
  +	}
  +
   
  +	public ITreeContentProvider getContentProvider() {
  +		return null;
  +	}
  +	public  LabelProvider getLabelProvider() {
  +		return null;
  +	}
   	
  -	public abstract ITreeContentProvider getContentProvider();
  -	public abstract LabelProvider getLabelProvider();
  +	public IPropertySheetPage getPropertySheetPage() {
  +		return null;
  +	}
   	
  -	public abstract IPropertySheetPage getPropertySheetPage();
  +	public ViewProviderPreferenceComposite createPreferenceComposite(Composite parent, int style) {
  +		return null;
  +	}
   	
   	protected void refreshViewer() {
   		if( isEnabled() ) {
  
  
  
  1.6       +5 -1      jbosside/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/viewproviders/ModuleViewProvider.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: ModuleViewProvider.java
  ===================================================================
  RCS file: /cvsroot/jboss/jbosside/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/viewproviders/ModuleViewProvider.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -b -r1.5 -r1.6
  --- ModuleViewProvider.java	10 Jul 2006 15:52:23 -0000	1.5
  +++ ModuleViewProvider.java	27 Jul 2006 06:34:00 -0000	1.6
  @@ -80,6 +80,10 @@
   						IServerWorkingCopy wc = selection.server.createWorkingCopy();
   						wc.modifyModules(null, selection.module , null);
   						wc.save(true, null);
  +						// Re-publish in case the configuration change has not been published yet.
  +						PublishServerJob publishJob = new PublishServerJob(selection.server, IServer.PUBLISH_INCREMENTAL, false);
  +						publishJob.schedule();
  +
   					} catch (Exception e) {
   						// ignore
   					}
  @@ -145,7 +149,7 @@
   
   			
   			
  -			if( parentElement instanceof ServerViewProvider ) {
  +			if( parentElement instanceof ServerViewProvider && input != null ) {
   				IModule[] modules = input.getModules(); 
   				int size = modules.length;
   				ModuleServer[] ms = new ModuleServer[size];
  
  
  
  1.6       +7 -1      jbosside/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/viewproviders/EventLogViewProvider.java
  
  (In the diff below, changes in quantity of whitespace are not shown.)
  
  Index: EventLogViewProvider.java
  ===================================================================
  RCS file: /cvsroot/jboss/jbosside/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/viewproviders/EventLogViewProvider.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -b -r1.5 -r1.6
  --- EventLogViewProvider.java	13 Jul 2006 04:16:31 -0000	1.5
  +++ EventLogViewProvider.java	27 Jul 2006 06:34:00 -0000	1.6
  @@ -153,6 +153,7 @@
   			return obj.toString();
   		}
   		public Image getImage(Object obj) {
  +			try {
   			ProcessLogEvent event = (ProcessLogEvent)obj;
   			IServer server = event.getRoot().getServer();
   			IServerType serverType = server.getServerType();
  @@ -202,7 +203,12 @@
   			if( obj instanceof TwiddleLogEvent ) {
   				return JBossServerUISharedImages.getImage(JBossServerUISharedImages.TWIDDLE_IMAGE);
   			}
  +			} catch( Exception e ) {
  +				e.printStackTrace();
  +				ProcessLogEvent event = (ProcessLogEvent)obj;
  +				event.getRoot();
   			
  +			}
   
   
   			
  
  
  
  1.1      date: 2006/07/27 06:34:00;  author: rawb;  state: Exp;jbosside/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/viewproviders/DescriptorXPathViewProvider.java
  
  Index: DescriptorXPathViewProvider.java
  ===================================================================
  package org.jboss.ide.eclipse.as.ui.viewproviders;
  
  import java.io.File;
  import java.lang.reflect.InvocationTargetException;
  
  import org.eclipse.core.runtime.IProgressMonitor;
  import org.eclipse.jface.action.Action;
  import org.eclipse.jface.action.IMenuListener;
  import org.eclipse.jface.action.IMenuManager;
  import org.eclipse.jface.action.MenuManager;
  import org.eclipse.jface.action.Separator;
  import org.eclipse.jface.dialogs.ProgressMonitorDialog;
  import org.eclipse.jface.operation.IRunnableWithProgress;
  import org.eclipse.jface.viewers.ILabelProviderListener;
  import org.eclipse.jface.viewers.ISelection;
  import org.eclipse.jface.viewers.IStructuredSelection;
  import org.eclipse.jface.viewers.ITableLabelProvider;
  import org.eclipse.jface.viewers.ITreeContentProvider;
  import org.eclipse.jface.viewers.LabelProvider;
  import org.eclipse.jface.viewers.TreeViewer;
  import org.eclipse.jface.viewers.Viewer;
  import org.eclipse.jface.window.Window;
  import org.eclipse.swt.SWT;
  import org.eclipse.swt.custom.TreeEditor;
  import org.eclipse.swt.graphics.Color;
  import org.eclipse.swt.graphics.GC;
  import org.eclipse.swt.graphics.Image;
  import org.eclipse.swt.graphics.Point;
  import org.eclipse.swt.graphics.Rectangle;
  import org.eclipse.swt.layout.FormAttachment;
  import org.eclipse.swt.layout.FormData;
  import org.eclipse.swt.layout.FormLayout;
  import org.eclipse.swt.widgets.Composite;
  import org.eclipse.swt.widgets.Control;
  import org.eclipse.swt.widgets.Display;
  import org.eclipse.swt.widgets.Event;
  import org.eclipse.swt.widgets.Group;
  import org.eclipse.swt.widgets.Listener;
  import org.eclipse.swt.widgets.Menu;
  import org.eclipse.swt.widgets.MessageBox;
  import org.eclipse.swt.widgets.Shell;
  import org.eclipse.swt.widgets.Text;
  import org.eclipse.swt.widgets.Tree;
  import org.eclipse.swt.widgets.TreeColumn;
  import org.eclipse.swt.widgets.TreeItem;
  import org.eclipse.ui.IActionBars;
  import org.eclipse.ui.IWorkbenchPart;
  import org.eclipse.ui.views.properties.IPropertySheetPage;
  import org.eclipse.wst.server.core.IServer;
  import org.jboss.ide.eclipse.as.core.JBossServerCore;
  import org.jboss.ide.eclipse.as.core.model.SimpleTreeItem;
  import org.jboss.ide.eclipse.as.core.model.DescriptorModel.ServerDescriptorModel.XPathTreeItem;
  import org.jboss.ide.eclipse.as.core.model.DescriptorModel.ServerDescriptorModel.XPathTreeItem2;
  import org.jboss.ide.eclipse.as.core.server.JBossServer;
  import org.jboss.ide.eclipse.as.core.server.ServerAttributeHelper;
  import org.jboss.ide.eclipse.as.core.server.ServerAttributeHelper.SimpleXPathPreferenceTreeItem;
  import org.jboss.ide.eclipse.as.core.server.ServerAttributeHelper.XPathPreferenceTreeItem;
  import org.jboss.ide.eclipse.as.core.util.ASDebug;
  import org.jboss.ide.eclipse.as.ui.JBossServerUIPlugin.ServerViewProvider;
  import org.jboss.ide.eclipse.as.ui.dialogs.XPathDialogs.XPathCategoryDialog;
  import org.jboss.ide.eclipse.as.ui.dialogs.XPathDialogs.XPathDialog;
  import org.jboss.ide.eclipse.as.ui.views.JBossServerView;
  import org.jboss.ide.eclipse.as.ui.views.JBossServerTableViewer.ContentWrapper;
  
  public class DescriptorXPathViewProvider extends JBossServerViewExtension {
  	private XPathTreeContentProvider contentProvider;
  	private XPathTreeLabelProvider labelProvider;
  	private DescriptorXPathPropertySheetPage propertyPage;
  	
  	private static final String XPATH_PROPERTY = "_XPATH_PROPERTY_";
  	private static final String XPATH_PROPERTY_LOADED = "_XPATH_PROPERTY_LOADED_";
  
  
  	private Action newXPathCategoryAction, deleteXPathCategoryAction, newXPathAction, editXPathAction, deleteXPathAction;
  
  	private IServer server;
  	private JBossServer jbServer;
  	private SimpleXPathPreferenceTreeItem root;
  	
  
  	
  	public DescriptorXPathViewProvider() {
  		contentProvider = new XPathTreeContentProvider();
  		labelProvider = new XPathTreeLabelProvider();
  		getPropertySheetPage(); // prime it
  		createActions();
  		addListeners();
  	}
  	
  	public SimpleXPathPreferenceTreeItem getRoot() {
  		if( root == null ) {
  			root = jbServer.getAttributeHelper().getXPathPreferenceTree();
  		}
  		return root;
  	}
  	
  
  	
  	public void createActions() {
  		newXPathCategoryAction = new Action() {
  			public void run() {
  				SimpleTreeItem item = getRoot();
  				XPathCategoryDialog d = 
  					new XPathCategoryDialog(Display.getCurrent().getActiveShell(), item);
  				if( d.open() == Window.OK ) {
  					String newCategory = d.getText();
  					SimpleXPathPreferenceTreeItem child = new SimpleXPathPreferenceTreeItem(item, newCategory);
  					ServerAttributeHelper helper = jbServer.getAttributeHelper();
  					helper.saveXPathPreferenceTree(getRoot());
  					helper.save();
  					refreshViewer();
  				}
  			}
  		};
  		newXPathCategoryAction.setText("New Category");	
  		
  		deleteXPathCategoryAction= new Action() {
  			public void run() {
  				Object selected = getServerViewSelection();
  				if( selected instanceof SimpleXPathPreferenceTreeItem && ((SimpleXPathPreferenceTreeItem)selected).getParent().equals(getRoot())) {
  					int style = SWT.APPLICATION_MODAL | SWT.YES | SWT.NO;
  					MessageBox messageBox = new MessageBox (Display.getCurrent().getActiveShell(), style);
  					messageBox.setText ("Remove Category?");
  					messageBox.setMessage ("Are you sure you want to delete this category and\nall of its elements?"
  							+ " All sub-nodes will be lost.");
  					if( messageBox.open () == SWT.YES ) {
  						getRoot().deleteChild(((SimpleXPathPreferenceTreeItem)selected));
  						ServerAttributeHelper helper = jbServer.getAttributeHelper();
  						helper.saveXPathPreferenceTree(getRoot());
  						helper.save();
  						
  						refreshViewer();
  					}
  				}
  			}
  		};
  		deleteXPathCategoryAction.setText("Remove Category");
  		
  		
  		newXPathAction = new Action() {
  			public void run() {
  				SimpleTreeItem tree = getRoot();
  					Object o = getServerViewSelection();
  					if( o != null && o instanceof SimpleXPathPreferenceTreeItem) {
  						String category = (String)  ((SimpleXPathPreferenceTreeItem)o).getData();
  						XPathDialog d = new XPathDialog(Display.getCurrent().getActiveShell(), tree, category, jbServer);
  						if( d.open() == Window.OK ) {
  							SimpleTreeItem[] categories = tree.getChildren2();
  							SimpleTreeItem categoryItem = null;
  							for( int i = 0; i < categories.length; i++ ) {
  								if( categories[i].getData().equals(category)) 
  									categoryItem = categories[i];
  							}
  							if( categoryItem != null ) {
  								XPathPreferenceTreeItem dsfa = new XPathPreferenceTreeItem(categoryItem, d.getName(), d.getXpath(), d.getAttribute());
  								ServerAttributeHelper helper = jbServer.getAttributeHelper();
  								helper.saveXPathPreferenceTree(getRoot());
  								helper.save();
  								refreshViewer();
  							}
  						}
  					}
  				}
  		};
  		newXPathAction.setText("New XPath");
  
  		editXPathAction = new Action() {
  			public void run() {
  				SimpleTreeItem tree = getRoot();
  				Object o = getXPathViewSelection();
  					if( o != null && o instanceof XPathPreferenceTreeItem) {
  						XPathPreferenceTreeItem original = (XPathPreferenceTreeItem)o;
  						String category = (String)  original.getParent().getData();
  						
  						XPathDialog d = new XPathDialog(Display.getCurrent().getActiveShell(), tree, 
  														category, jbServer, original.getName());
  						d.setAttribute(original.getAttributeName());
  						d.setXpath(original.getXPath());
  						
  						if( d.open() == Window.OK ) {
  							original.setAttributeName(d.getAttribute());
  							original.setXPath(d.getXpath());
  							original.setName(d.getName());
  							ServerAttributeHelper helper = jbServer.getAttributeHelper();
  							helper.saveXPathPreferenceTree(getRoot());
  							helper.save();
  							refreshViewer();
  						}
  					}
  				}
  		};
  		editXPathAction.setText("Edit XPath");
  
  		deleteXPathAction = new Action() {
  			public void run() {
  				SimpleTreeItem tree = getRoot();
  				Object o = getXPathViewSelection();
  				if( o instanceof XPathPreferenceTreeItem ) {
  					((XPathPreferenceTreeItem)o).getParent().deleteChild((XPathPreferenceTreeItem)o);
  					ServerAttributeHelper helper = jbServer.getAttributeHelper();
  					helper.saveXPathPreferenceTree(getRoot());
  					helper.save();
  					refreshViewer();
  				}
  			}
  		};
  		deleteXPathAction.setText("Delete XPath");
  	}
  	
  	public void addListeners() {
  		
  	}
  	
  	public void fillContextMenu(Shell shell, IMenuManager menu, Object selection) {
  		if( getServerViewSelection() instanceof ServerViewProvider ) {
  			menu.add(this.newXPathCategoryAction);
  			menu.add(new Separator());
  			return;
  		}
  		
  		if( getServerViewSelection() instanceof SimpleXPathPreferenceTreeItem ) {
  			menu.add(this.newXPathAction);
  			menu.add(this.deleteXPathCategoryAction);
  			menu.add(new Separator());
  		}
  		
  		ASDebug.p("serverViewerSelection is " + selection, this);
  	}
  	
  	public Object getServerViewSelection() {
  		return JBossServerView.getDefault().getJbViewer().getSelectedElement();
  	}
  	public Object getXPathViewSelection() {
  		if( propertyPage != null && propertyPage.xpathTree != null ) {
  			TreeItem[] items = propertyPage.xpathTree.getSelection();
  			if( items.length == 1 ) {
  				return items[0].getData();
  			}
  		}
  		return null;
  	}
  
  	protected class XPathTreeContentProvider implements ITreeContentProvider {
  		
  		public Object[] getChildren(Object parentElement) {
  			if( parentElement instanceof ServerViewProvider ) 
  				return getRoot().getChildren2();
  			return new Object[0];
  		}
  		public Object getParent(Object element) {
  			return null;
  		}
  		public boolean hasChildren(Object element) {
  			return getChildren(element).length > 0 ? true : false;
  		}
  		public Object[] getElements(Object inputElement) {
  			return new Object[0];
  		}
  		public void dispose() {
  		}
  		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
  			server = (IServer)newInput;
  			jbServer = JBossServerCore.getServer(server);
  			root = null;
  		}
  
  	}
  	protected class XPathTreeLabelProvider extends LabelProvider {
  		public Image getImage(Object element) {
  			return null;
  		}
  		public String getText(Object element) {
  			if( element instanceof SimpleXPathPreferenceTreeItem) {
  				return ((SimpleXPathPreferenceTreeItem)element).getData().toString();
  			}
  			return "";
  		}
  	}
  
  	
  	public ITreeContentProvider getContentProvider() {
  		return contentProvider;
  	}
  
  	public LabelProvider getLabelProvider() {
  		return labelProvider;
  	}
  
  	
  	public IPropertySheetPage getPropertySheetPage() {
  		if( propertyPage == null ) {
  			propertyPage = new DescriptorXPathPropertySheetPage();
  		}
  		return propertyPage;
  	}
  	
  	
  	
  	public class DescriptorXPathPropertySheetPage implements IPropertySheetPage {
  		private Object input;
  		
  		
  		private TreeViewer xpathTreeViewer;
  		private TreeColumn column, column2, column3;
  		private Tree xpathTree;
  
  		private Group xPathGroup;
  		
  		public void createControl(Composite parent) {
  			createXPathGroup(parent);
  			addViewerMenus();
  		}
  
  		private void addViewerMenus() {
  			MenuManager menuManager = new MenuManager("#PopupMenu"); 
  			menuManager.setRemoveAllWhenShown(true);
  			final Shell shell = xpathTree.getShell();
  			menuManager.addMenuListener(new IMenuListener() {
  				public void menuAboutToShow(IMenuManager mgr) {
  					xpathTreeMenuAboutToShow(shell, mgr);
  				}
  			});
  			Menu menu = menuManager.createContextMenu(xpathTree);
  			xpathTree.setMenu(menu);
  		}
  		
  		private void xpathTreeMenuAboutToShow(Shell shell, IMenuManager menu) {
  			menu.add(newXPathAction);
  			if( getXPathViewSelection() != null && getXPathViewSelection() instanceof XPathPreferenceTreeItem) {
  				menu.add(editXPathAction);
  				menu.add(deleteXPathAction);
  			}
  		}
  
  		
  		public void dispose() {
  		}
  
  		public Control getControl() {
  			return xPathGroup;
  		}
  
  		public void setActionBars(IActionBars actionBars) {
  		}
  
  		public void setFocus() {
  		}
  
  		public void selectionChanged(IWorkbenchPart part, ISelection selection) {
  			//input = null;
  			Object element = ((IStructuredSelection)selection).getFirstElement();
  			if( element instanceof ContentWrapper ) {
  
  				if( input == ((ContentWrapper)element).getElement() ) return;
  				
  				input = ((ContentWrapper)element).getElement();
  				ASDebug.p("Selection changed to " + input, this);
  				IRunnableWithProgress op = new IRunnableWithProgress() {
  					public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
  						final IProgressMonitor monitor2 = monitor;
  						jbServer.getDescriptorModel().refreshDescriptors(monitor2);
  						Display.getDefault().asyncExec(new Runnable() { 
  							public void run() {
  								xpathTreeViewer.setInput(input);
  								xpathTreeViewer.expandToLevel(2);
  							}
  						});
  					}
  				};
  				try {
  				new ProgressMonitorDialog(new Shell()).run(false, true, op);
  					//JBossServerCore.getServer(contentProvider.server).getDescriptorModel().refreshDescriptors(new NullProgressMonitor());
  
  				} catch( Exception e) {
  					e.printStackTrace();
  				}
  			}
  		}
  		
  		
  
  		protected class XPathTreeLabelProvider implements ITableLabelProvider {
  			public Image getColumnImage(Object element, int columnIndex) {
  				return null;
  			}
  			public String getColumnText(Object element, int columnIndex) {
  				if( element instanceof XPathTreeItem ) {
  					Object data = ((XPathTreeItem)element).getData();
  					if( data instanceof File) {
  						if( columnIndex == 0 ) {
  							return ((File)data).getName();
  						}
  						if( columnIndex == 1 && ((XPathTreeItem)element).getChildren2().length == 1 ) {
  							element = ((XPathTreeItem)element).getChildren2()[0];
  						}
  					}
  				}
  				
  				if( element instanceof XPathTreeItem2) {
  					XPathTreeItem2 element2 = (XPathTreeItem2)element;
  					if( columnIndex == 0 ) 
  						return "Match " + element2.getIndex();
  					if( columnIndex == 1 ) {
  						String x = element2.getText();
  						return x;
  					}
  				}
  				
  				if( element instanceof XPathPreferenceTreeItem) {
  					if( columnIndex == 0 ) return ((XPathPreferenceTreeItem)element).getName().toString();
  					if( columnIndex == 1 ) {
  						Object o = ((XPathPreferenceTreeItem)element).getProperty(XPATH_PROPERTY);
  						return o == null ? "" : o.toString();
  					}
  				}
  				if( element instanceof SimpleXPathPreferenceTreeItem ) {
  					if( columnIndex == 0 ) 
  						return ((SimpleXPathPreferenceTreeItem)element).getData().toString();
  				}
  				return "";
  			}
  			public void addListener(ILabelProviderListener listener) {
  			}
  			public void dispose() {
  			}
  			public boolean isLabelProperty(Object element, String property) {
  				return false;
  			}
  			public void removeListener(ILabelProviderListener listener) {
  			} 
  		}
  		protected class XPathTreeSelectionListener implements Listener {
  			
  			private final Color black;
  			private final TreeItem[] lastItem;
  			private final TreeEditor editor;
  			private int mouseX;
  			
  			public XPathTreeSelectionListener() {
  				black = Display.getCurrent().getSystemColor (SWT.COLOR_BLACK);
  				lastItem = new TreeItem [1];
  				editor = new TreeEditor (xpathTree);
  				mouseX = 0;
  			}
  			
  			
  			private boolean canEditLocationColumn(TreeItem item) {
  				if( item == null || item != lastItem[0] ) return false;
  
  				// if we're "JNDI" (aka an XPath item) then yes. All others no.
  				if( item.getData() instanceof XPathPreferenceTreeItem ) return true;
  				return false;
  			}
  			
  			private boolean canEditAttributeColumn(TreeItem item) {
  				// if we're the "JNDI" line then we're editing the xpath's attribute name (code, name, etc)
  				if( item.getData() instanceof XPathPreferenceTreeItem ) {
  					return true;
  				}
  
  				// if we're a file entry under "JNDI", and have multiple matches, no editing on this line
  				if( item.getData() instanceof XPathTreeItem && ((XPathTreeItem)item.getData()).getChildren2().length > 1 ) return false;
  
  				return true;
  			}
  
  			private boolean canEditValueColumn(TreeItem item) {
  				// if we're the "JNDI" line 
  				if( item.getData() instanceof XPathPreferenceTreeItem ) {
  					return true;
  				}
  				return false;
  			}
  
  			private int getColumnToEdit(TreeItem item) {
  				boolean locColumn = canEditLocationColumn(item);
  				boolean attributeColumn = canEditAttributeColumn(item);
  				boolean valueColumn = canEditValueColumn(item);
  				int total = 0;
  				if( locColumn ) total++;
  				if(attributeColumn) total++;
  				if(valueColumn) total++;
  				
  				if( total == 0 ) return -1;
  				if( total == 1 ) {
  					if( locColumn ) return 0;
  					if(attributeColumn) return 1;
  					if( valueColumn) return 2;
  				}
  				
  				// we CAN edit more than one. Where's the mouse?
  				if( mouseX < column.getWidth() && locColumn ) return 0;
  				if( mouseX < (column.getWidth() + column2.getWidth()) && valueColumn ) return 1;
  				return 2;
  			}
  			
  			
  			public void handleEvent (Event event) {
  //				final TreeItem item = (TreeItem) event.item;
  				TreeItem[] selectedItems = xpathTree.getSelection();
  				if( selectedItems.length != 1 ) return;
  				
  				final TreeItem item = selectedItems[0];
  				
  				final int column = getColumnToEdit(item);
  
  				if( column == -1 ) {
  					lastItem[0] = item;
  					return;
  				}
  				
  				boolean isCarbon = SWT.getPlatform ().equals ("carbon");
  				final Composite composite = new Composite (xpathTree, SWT.NONE);
  				if (!isCarbon) composite.setBackground (black);
  				final Text text = new Text (composite, SWT.NONE);
  				final int inset = isCarbon ? 0 : 1;
  				composite.addListener (SWT.Resize, new Listener () {
  					public void handleEvent (Event e) {
  						Rectangle rect = composite.getClientArea ();
  						text.setBounds (rect.x + inset, rect.y + inset, rect.width - inset * 2, rect.height - inset * 2);
  					}
  				});
  				Listener textListener = new Listener () {
  					public void handleEvent (final Event e) {
  						switch (e.type) {
  							case SWT.FocusOut:
  								treeviewerEditorTextChanged(item, text, column);
  								composite.dispose ();
  								break;
  							case SWT.Verify:
  								String newText = text.getText();
  								String leftText = newText.substring (0, e.start);
  								String rightText = newText.substring (e.end, newText.length ());
  								GC gc = new GC (text);
  								Point size = gc.textExtent (leftText + e.text + rightText);
  								gc.dispose ();
  								size = text.computeSize (size.x, SWT.DEFAULT);
  								editor.horizontalAlignment = SWT.LEFT;
  								Rectangle itemRect = item.getBounds (), rect = xpathTree.getClientArea ();
  								editor.minimumWidth = Math.max (size.x, itemRect.width) + inset * 2;
  								int left = itemRect.x, right = rect.x + rect.width;
  								editor.minimumWidth = Math.min (editor.minimumWidth, right - left);
  								editor.minimumHeight = size.y + inset * 2;
  								editor.setColumn(column);
  								editor.layout ();
  								break;
  							case SWT.Traverse:
  								switch (e.detail) {
  									case SWT.TRAVERSE_RETURN:
  										treeviewerEditorTextChanged(item, text, column);
  										//FALL THROUGH
  									case SWT.TRAVERSE_ESCAPE:
  										composite.dispose ();
  										e.doit = false;
  								}
  								break;
  						}
  					}
  				};
  				text.addListener (SWT.FocusOut, textListener);
  				text.addListener (SWT.Traverse, textListener);
  				text.addListener (SWT.Verify, textListener);
  				editor.setEditor (composite, item);
  				text.setText (item.getText(column));
  				text.selectAll ();
  				text.setFocus ();
  
  				lastItem [0] = item;
  			}
  
  			public int getMouseX() {
  				return mouseX;
  			}
  
  			public void setMouseX(int mouseX) {
  				this.mouseX = mouseX;
  			}
  		}
  
  		protected void createXPathGroup(Composite main) {
  			xPathGroup = new Group(main, SWT.NONE);
  			
  			int groupWidth = 500;
  			
  			xPathGroup.setText("Descriptor Values");
  			FormData groupData = new FormData();
  			groupData.right = new FormAttachment(100, -5);
  			groupData.left = new FormAttachment(0, 5);
  			groupData.top = new FormAttachment(0,5);
  			groupData.bottom = new FormAttachment(100, -5);
  			xPathGroup.setLayoutData(groupData);
  			
  			xPathGroup.setLayout(new FormLayout());
  			
  			
  			final Tree xpathTree = new Tree(xPathGroup, SWT.BORDER | SWT.FULL_SELECTION);
  			this.xpathTree = xpathTree;
  
  			column = new TreeColumn(xpathTree, SWT.NONE);
  			column2 = new TreeColumn(xpathTree, SWT.NONE);
  			column3 = new TreeColumn(xpathTree, SWT.NONE);
  			
  			column.setText("Name / Location");
  			column2.setText("Attribute Key / Value");
  			column3.setText("XPath / XML");
  
  			column.setWidth(groupWidth * 4 / 20);
  			column2.setWidth(groupWidth * 6 / 20);
  			column3.setWidth(groupWidth * 9 / 20);
  			
  
  			FormData treeData = new FormData();
  			treeData.left = new FormAttachment(0,5);
  			treeData.right = new FormAttachment(100, -5);
  			treeData.top = new FormAttachment(0,5);
  			treeData.bottom = new FormAttachment(100, -5);
  			xpathTree.setLayoutData(treeData);
  			
  			xpathTree.setHeaderVisible(true);
  			xpathTree.setLinesVisible(true);
  			
  			
  			xpathTreeViewer = new TreeViewer(xpathTree);
  			xpathTreeViewer.setContentProvider(new XPathPropertyContentProvider());
  			xpathTreeViewer.setLabelProvider(new XPathPropertyLabelProvider());
  			
  			final XPathTreeSelectionListener selListener = new XPathTreeSelectionListener();
  //			xpathTree.addListener (SWT.Selection, selListener);
  			xpathTree.addListener (SWT.MouseDoubleClick, selListener);
  			
  			// alerts the top listener as to the mouse position, to know which column is serverViewerSelection
  			xpathTree.addListener(SWT.MouseMove, new Listener() {
  				public void handleEvent(Event event) {
  					selListener.setMouseX(event.x);
  				} 
  			});
  		}
  		
  		private void treeviewerEditorTextChanged(TreeItem item, Text text, int column) {
  			if( column == 0 ) { 
  				xpathTextKeyChanged(item, text);
  			} else if( column == 1 ) {
  				xpathTextValueChanged(item, text);
  			} else if( column == 2 ) {
  				// TODO add to own method
  				if( item.getData() instanceof XPathPreferenceTreeItem ) {
  					String xp = ((XPathPreferenceTreeItem)item.getData()).getXPath();
  					if( !xp.equals(text.getText())) {
  						((XPathPreferenceTreeItem)item.getData()).setXPath(text.getText());
  						xpathTreeViewer.refresh();
  					}
  				}
  
  			}
  		}
  		
  		private void xpathTextValueChanged(TreeItem item, Text text) {
  			if( text.isDisposed() || item.isDisposed()) return;
  			
  			// xpath changed entirely
  			if( item.getData() instanceof XPathPreferenceTreeItem ) {
  				String att = ((XPathPreferenceTreeItem)item.getData()).getAttributeName();
  				if( att != null && !att.equals(text.getText())) {
  					((XPathPreferenceTreeItem)item.getData()).setAttributeName(text.getText());
  					xpathTreeViewer.refresh();
  				}
  				return;
  			}
  
  			
  			// we're changing the value in the actual descriptor.
  			XPathTreeItem2 itemToChange = getChangedNode(item.getData());
  			if( itemToChange != null && itemToChange instanceof XPathTreeItem2 ) {
  				
  				// if its unchanged do nothing
  				if( ((XPathTreeItem2)itemToChange).getText().equals(text.getText())) {
  					return;
  				}
  				
  				// set the text and add the document to the list of dirty ones
  				((XPathTreeItem2)itemToChange).setText(text.getText());
  				if( itemToChange.getDocument() != null ) {
  					itemToChange.saveDescriptor();
  				}
  				xpathTreeViewer.refresh(item.getData());
  			} 
  		}
  		
  		private void xpathTextKeyChanged(TreeItem item, Text text) {
  			// "JNDI" 
  			if( text.isDisposed() || item.isDisposed()) return;
  			
  			if( item.getData() instanceof XPathPreferenceTreeItem ) {
  				
  				SimpleXPathPreferenceTreeItem parentItem = (SimpleXPathPreferenceTreeItem)((SimpleXPathPreferenceTreeItem)item.getData()).getParent();
  				SimpleTreeItem[] kids = parentItem.getChildren2();
  				
  				boolean valid = true;
  				String textString = text.getText();
  				for( int i = 0; i < kids.length; i++ ) {
  					if( textString.equals(((XPathPreferenceTreeItem)kids[i]).getName())) 
  						valid = false;
  				}
  
  				if( valid ) {
  					((XPathPreferenceTreeItem)item.getData()).setName(text.getText());
  					ServerAttributeHelper helper = jbServer.getAttributeHelper(); 
  					helper.saveXPathPreferenceTree(parentItem.getParent());
  					helper.save();
  					xpathTreeViewer.refresh();
  				}
  				return;
  			}
  		}
  		
  		private XPathTreeItem2 getChangedNode(Object data) {
  			// if we are the node to change, change me
  			if( data instanceof XPathTreeItem2 ) {
  				return (XPathTreeItem2)data;
  			}
  			
  			// if we're a node which represents a file, but only have one matched node, thats the node.
  			if( data instanceof XPathTreeItem && ((XPathTreeItem)data).getChildren2().length == 1 ) {
  				return (XPathTreeItem2) (((XPathTreeItem)data).getChildren2()[0]);
  			}
  			
  			// if we're a top level tree item (JNDI), with one file child and one mbean grandchild, the grandchild is the node
  			if( data instanceof XPathPreferenceTreeItem && ((XPathPreferenceTreeItem)data).getChildren2().length == 1 ) {
  				XPathTreeItem item = ((XPathTreeItem) ((XPathPreferenceTreeItem)data).getChildren2()[0]);
  				if( item.getChildren2().length == 1 ) 
  					return (XPathTreeItem2)item.getChildren2()[0];
  			}
  			return null;
  		}
  	}
  	
  	protected class XPathPropertyContentProvider implements ITreeContentProvider {
  		
  		private SimpleXPathPreferenceTreeItem category;
  		
  		public Object[] getChildren(Object parentElement) {
  			// we're a leaf
  			if( parentElement instanceof XPathTreeItem2 ) 
  				return new Object[0];
  			
  			// we're a file node (blah.xml) 
  			if( parentElement instanceof XPathTreeItem ) {
  				if( ((XPathTreeItem)parentElement).getChildren2().length > 1 ) 
  					return ((XPathTreeItem)parentElement).getChildren2();
  				return new Object[0];
  			}
  			
  			// we're the named element (JNDI)
  			if( parentElement instanceof XPathPreferenceTreeItem ) {
  				SimpleTreeItem[] kids = ((XPathPreferenceTreeItem)parentElement).getChildren2();
  				return kids;
  			}
  
  			
  			if( parentElement instanceof ServerViewProvider ) 
  				return jbServer.getAttributeHelper().getXPathPreferenceTree().getChildren2();
  			return new Object[0];
  		}
  		public Object getParent(Object element) {
  			return null;
  		}
  		public boolean hasChildren(Object element) {
  			return getChildren(element).length > 0 ? true : false;
  		}
  		public Object[] getElements(Object inputElement) {
  			if( inputElement instanceof SimpleXPathPreferenceTreeItem ) {
  				SimpleTreeItem[] items =  ((SimpleXPathPreferenceTreeItem)inputElement).getChildren2();
  				for( int i = 0; i < items.length; i++ )
  					ensureLoaded((SimpleXPathPreferenceTreeItem)items[i]);
  				return items;
  			}
  			return new Object[0];
  		}
  		public void ensureLoaded(SimpleXPathPreferenceTreeItem item) {
  			if( item instanceof XPathPreferenceTreeItem ) {
  				
  				String xpath = ((XPathPreferenceTreeItem)item).getXPath();
  				String attribute = ((XPathPreferenceTreeItem)item).getAttributeName();
  				XPathTreeItem[] items = new XPathTreeItem[0];
  				if( attribute == null || attribute.equals("")) {
  					items = jbServer.getDescriptorModel().getXPath(xpath);
  				} else {
  					items = jbServer.getDescriptorModel().getXPath(xpath, attribute);
  				}
  				
  				if( item.getProperty(XPATH_PROPERTY_LOADED) != null ) {
  					item.deleteChildren();
  				}
  				for( int i = 0; i < items.length; i++ ) {
  					item.addChild(items[i]);
  				}
  				item.setProperty(XPATH_PROPERTY_LOADED, new Boolean(true));
  			}
  		}
  
  		
  		public void dispose() {
  		}
  		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
  			category = (SimpleXPathPreferenceTreeItem) newInput;
  		}
  
  	}
  	protected class XPathPropertyLabelProvider extends LabelProvider implements ITableLabelProvider {
  
  		public Image getColumnImage(Object element, int columnIndex) {
  			return null;
  		}
  		public String getColumnText(Object element, int columnIndex) {
  			if( element instanceof XPathTreeItem ) {
  				Object data = ((XPathTreeItem)element).getData();
  				if( data instanceof File) {
  					if( columnIndex == 0 ) {
  						return ((File)data).getName();
  					}
  					if( ((XPathTreeItem)element).getChildren2().length == 1 ) {
  						element = ((XPathTreeItem)element).getChildren2()[0];
  					}
  				}
  			}
  			
  			if( element instanceof XPathTreeItem2) {
  				XPathTreeItem2 element2 = (XPathTreeItem2)element;
  				if( columnIndex == 0 ) return "Match " + element2.getIndex();
  				if( columnIndex == 1 ) return element2.getText();
  				if( columnIndex == 2 ) return element2.elementAsXML();
  			}
  			
  			if( element instanceof XPathPreferenceTreeItem) {
  				if( columnIndex == 0 ) return ((XPathPreferenceTreeItem)element).getName().toString();
  				if( columnIndex == 1 ) return ((XPathPreferenceTreeItem)element).getAttributeName();
  				if( columnIndex == 2 ) return ((XPathPreferenceTreeItem)element).getXPath();
  			}
  			if( element instanceof SimpleXPathPreferenceTreeItem ) {
  				if( columnIndex == 0 ) 
  					return ((SimpleXPathPreferenceTreeItem)element).getData().toString();
  			}
  			return "";
  		}
  	}
  
  	protected void refreshViewer() {
  		if( isEnabled() ) {
  			try {
  				JBossServerView.getDefault().refreshJBTree(provider);
  				if( propertyPage != null ) {
  					propertyPage.xpathTreeViewer.refresh();
  				}
  			} catch(Exception e) {
  			}
  		}
  	}
  
  }
  
  
  



More information about the jboss-cvs-commits mailing list