org.eclipse.jst.ws.jaxws.ui

https://bugs.eclipse.org/bugs/show_bug.cgi?id=260695
diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/.classpath b/bundles/org.eclipse.jst.ws.jaxws.ui/.classpath
new file mode 100755
index 0000000..2d1a430
--- /dev/null
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<classpath>

+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>

+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>

+	<classpathentry kind="src" path="src"/>

+	<classpathentry kind="output" path="bin"/>

+</classpath>

diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/.project b/bundles/org.eclipse.jst.ws.jaxws.ui/.project
new file mode 100755
index 0000000..e5a0fde
--- /dev/null
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.jst.ws.jaxws.ui</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.jst.ws.jaxws.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100755
index 0000000..f6eebfa
--- /dev/null
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Thu Dec 18 11:00:26 GMT 2008

+eclipse.preferences.version=1

+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5

+org.eclipse.jdt.core.compiler.compliance=1.5

+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error

+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error

+org.eclipse.jdt.core.compiler.source=1.5

diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/META-INF/MANIFEST.MF b/bundles/org.eclipse.jst.ws.jaxws.ui/META-INF/MANIFEST.MF
new file mode 100755
index 0000000..5ae44de
--- /dev/null
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,24 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.jst.ws.jaxws.ui;singleton:=true
+Bundle-Version: 0.5.0.qualifier
+Bundle-Localization: plugin
+Bundle-Activator: org.eclipse.jst.ws.internal.jaxws.ui.JAXWSUIPlugin
+Bundle-Vendor: %pluginProvider
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.jdt.ui,
+ org.eclipse.jface.text,
+ org.eclipse.ui.ide,
+ org.eclipse.core.resources,
+ org.eclipse.jdt.core,
+ org.eclipse.wst.command.env,
+ org.eclipse.wst.command.env.core,
+ org.eclipse.jst.ws.jaxws.core,
+ org.eclipse.ltk.core.refactoring,
+ org.eclipse.ltk.ui.refactoring,
+ org.eclipse.ui.editors,
+ org.eclipse.jdt.launching
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-ActivationPolicy: lazy
diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/about.html b/bundles/org.eclipse.jst.ws.jaxws.ui/about.html
new file mode 100644
index 0000000..5b6a031
--- /dev/null
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>February 19, 2009</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/build.properties b/bundles/org.eclipse.jst.ws.jaxws.ui/build.properties
new file mode 100755
index 0000000..d4e6333
--- /dev/null
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/build.properties
@@ -0,0 +1,8 @@
+source.. = src/

+output.. = bin/

+bin.includes = plugin.xml,\

+               META-INF/,\

+               .,\

+               icons/,\

+               about.html,\

+               plugin.properties

diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/icons/elcl16/filter_ps.gif b/bundles/org.eclipse.jst.ws.jaxws.ui/icons/elcl16/filter_ps.gif
new file mode 100644
index 0000000..a4c9e60
--- /dev/null
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/icons/elcl16/filter_ps.gif
Binary files differ
diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/icons/eview16/annotation_obj.gif b/bundles/org.eclipse.jst.ws.jaxws.ui/icons/eview16/annotation_obj.gif
new file mode 100755
index 0000000..435d62e
--- /dev/null
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/icons/eview16/annotation_obj.gif
Binary files differ
diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/icons/eview16/prop_ps.gif b/bundles/org.eclipse.jst.ws.jaxws.ui/icons/eview16/prop_ps.gif
new file mode 100644
index 0000000..d11c996
--- /dev/null
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/icons/eview16/prop_ps.gif
Binary files differ
diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/icons/obj16/false.gif b/bundles/org.eclipse.jst.ws.jaxws.ui/icons/obj16/false.gif
new file mode 100644
index 0000000..9bd9b0c
--- /dev/null
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/icons/obj16/false.gif
Binary files differ
diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/icons/obj16/true.gif b/bundles/org.eclipse.jst.ws.jaxws.ui/icons/obj16/true.gif
new file mode 100644
index 0000000..9cacb96
--- /dev/null
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/icons/obj16/true.gif
Binary files differ
diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/plugin.properties b/bundles/org.eclipse.jst.ws.jaxws.ui/plugin.properties
new file mode 100644
index 0000000..b042ba5
--- /dev/null
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/plugin.properties
@@ -0,0 +1,17 @@
+###############################################################################
+# Copyright (c) 2009 Shane Clarke
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# Shane Clarke - initial API and implementation
+###############################################################################
+
+#properties file for JAXWS UI
+pluginName=JAX-WS Tools UI (Incubation)
+providerName=Eclipse.org
+
+ANNOTATIONS_VIEW_CATEGORY_NAME=JAX-WS
+ANNOTATIONS_VIEW_NAME=Annotation Properties
\ No newline at end of file
diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/plugin.xml b/bundles/org.eclipse.jst.ws.jaxws.ui/plugin.xml
new file mode 100755
index 0000000..a45b5f2
--- /dev/null
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/plugin.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<?eclipse version="3.2"?>

+<plugin>

+

+   <extension point="org.eclipse.ui.views">

+      <category

+            name="%ANNOTATIONS_VIEW_CATEGORY_NAME"

+            id="org.eclipse.jst.ws.jwst.ui">

+      </category>

+      <view

+            name="%ANNOTATIONS_VIEW_NAME"

+            icon="icons/eview16/prop_ps.gif"

+            category="org.eclipse.jst.ws.jwst.ui"

+            class="org.eclipse.jst.ws.internal.jaxws.ui.views.AnnotationsView"

+            id="org.eclipse.jst.ws.jaxws.ui.views.AnnotationsView">

+      </view>

+   </extension>

+   

+ <!--  <extension point="org.eclipse.ui.perspectiveExtensions">

+      <perspectiveExtension targetID="org.eclipse.jdt.ui.JavaPerspective">

+         <view

+               relative="org.eclipse.ui.views.ProblemView"

+               relationship="stack"

+               id="org.eclipse.jst.ws.jaxws.ui.views.AnnotationsView">

+         </view>

+      </perspectiveExtension>

+   </extension> -->

+   

+</plugin>

diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/JAXWSUIMessages.java b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/JAXWSUIMessages.java
new file mode 100755
index 0000000..5ab7bf9
--- /dev/null
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/JAXWSUIMessages.java
@@ -0,0 +1,51 @@
+/*******************************************************************************

+ * Copyright (c) 2009 Shane Clarke.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *    Shane Clarke - initial API and implementation

+ *******************************************************************************/

+package org.eclipse.jst.ws.internal.jaxws.ui;

+

+import org.eclipse.osgi.util.NLS;

+

+/**

+ * @author sclarke

+ */

+public class JAXWSUIMessages extends NLS {

+    private static final String BUNDLE_NAME = "org.eclipse.jst.ws.internal.jaxws.ui.JAXWSUImessages"; //$NON-NLS-1$

+    

+    public static String ANNOTATION_ARRAY_CELL_EDITOR_ADD_LABEL;

+    public static String ANNOTATION_ARRAY_CELL_EDITOR_BROWSE_LABEL;

+    public static String ANNOTATION_ARRAY_CELL_EDITOR_DOWN_LABEL;

+    public static String ANNOTATION_ARRAY_CELL_EDITOR_EDIT_ARRAY_VALUES_TITLE;

+    public static String ANNOTATION_ARRAY_CELL_EDITOR_REMOVE_LABEL;

+    public static String ANNOTATION_ARRAY_CELL_EDITOR_SELECT_CLASS_TITLE;

+    public static String ANNOTATION_ARRAY_CELL_EDITOR_UP_LABEL;

+    public static String ANNOTATION_ARRAY_CELL_EDITOR_NESTED_ARRAYS_NOT_SUPPORTED;

+    

+    public static String ANNOTATION_EDITING_SUPPORT_NOT_VALID_MESSAGE_PREFIX;

+

+    public static String ANNOTATIONS_VIEW_ANNOTATIONS_COLUMN_NAME;

+    public static String ANNOTATIONS_VIEW_ANNOTATIONS_NOT_AVAILABLE_ON_SELECTION;

+    public static String ANNOTATIONS_VIEW_ANNOTATIONS_VALUES_COLUMN_NAME;

+

+    public static String ANNOTATIONS_VIEW_FILTER_ACTION_NAME;

+    public static String ANNOTATIONS_VIEW_FILTER_ACTION_SELECT_CATEGORIES_MESSAGE;

+

+    public static String ANNOTATIONS_VIEW_NO_SUITABLE_LIBRARY_FOUND;

+    public static String ANNOTATIONS_VIEW_OTHER_ANNOTATION_LIBRARIES_USE;

+    

+    public static String CONFIGURE_JAVA_1_6_LIBRARY;

+    

+    static {

+        // initialize resource bundle

+        NLS.initializeMessages(BUNDLE_NAME, JAXWSUIMessages.class);

+    }

+

+    private JAXWSUIMessages() {

+    }

+}

diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/JAXWSUIMessages.properties b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/JAXWSUIMessages.properties
new file mode 100644
index 0000000..0a8f77d
--- /dev/null
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/JAXWSUIMessages.properties
@@ -0,0 +1,32 @@
+###############################################################################
+# Copyright (c) 2009 Shane Clarke
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# Shane Clarke - initial API and implementation
+###############################################################################
+ANNOTATION_ARRAY_CELL_EDITOR_ADD_LABEL=Add
+ANNOTATION_ARRAY_CELL_EDITOR_BROWSE_LABEL=Browse...
+ANNOTATION_ARRAY_CELL_EDITOR_DOWN_LABEL=Down
+ANNOTATION_ARRAY_CELL_EDITOR_EDIT_ARRAY_VALUES_TITLE=Edit Array Values
+ANNOTATION_ARRAY_CELL_EDITOR_REMOVE_LABEL=Remove
+ANNOTATION_ARRAY_CELL_EDITOR_SELECT_CLASS_TITLE=Select Class
+ANNOTATION_ARRAY_CELL_EDITOR_UP_LABEL=Up
+ANNOTATION_ARRAY_CELL_EDITOR_NESTED_ARRAYS_NOT_SUPPORTED=Nested Arrays within Arrays not yet supported
+ANNOTATION_EDITING_SUPPORT_NOT_VALID_MESSAGE_PREFIX=Not a valid 
+
+ANNOTATIONS_VIEW_ANNOTATIONS_NOT_AVAILABLE_ON_SELECTION=Annotations not available for current selection
+ANNOTATIONS_VIEW_ANNOTATIONS_VALUES_COLUMN_NAME=Values
+ANNOTATIONS_VIEW_ANNOTATIONS_COLUMN_NAME=Annotations
+
+ANNOTATIONS_VIEW_FILTER_ACTION_NAME=Filters...
+ANNOTATIONS_VIEW_FILTER_ACTION_SELECT_CATEGORIES_MESSAGE=Select Annotation Categories to Filter
+
+ANNOTATIONS_VIEW_NO_SUITABLE_LIBRARY_FOUND=No suitable {0} library can be found on the projects classpath.\n\n
+
+ANNOTATIONS_VIEW_OTHER_ANNOTATION_LIBRARIES_USE=\n(For use with non JAX-WS libraries please setup the project with the required libraries.)\n\n
+
+CONFIGURE_JAVA_1_6_LIBRARY=To select a 1.6 or above compliant JRE configure the <a href="1" >Installed JREs</a> or change the JRE on the <a href="2" >Java build path</a>.
\ No newline at end of file
diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/JAXWSUIPlugin.java b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/JAXWSUIPlugin.java
new file mode 100755
index 0000000..8c7022e
--- /dev/null
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/JAXWSUIPlugin.java
@@ -0,0 +1,86 @@
+/*******************************************************************************

+ * Copyright (c) 2009 Shane Clarke.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *    Shane Clarke - initial API and implementation

+ *******************************************************************************/

+package org.eclipse.jst.ws.internal.jaxws.ui;

+

+import org.eclipse.core.runtime.IStatus;

+import org.eclipse.core.runtime.Status;

+import org.eclipse.jface.resource.ImageDescriptor;

+import org.eclipse.ui.plugin.AbstractUIPlugin;

+import org.osgi.framework.BundleContext;

+

+/**

+ * The activator class controls the plug-in life cycle

+ */

+public class JAXWSUIPlugin extends AbstractUIPlugin {

+

+	// The plug-in ID

+	public static final String PLUGIN_ID = "org.eclipse.jst.ws.jaxws.ui"; //$NON-NLS-1$

+

+	// The shared instance

+	private static JAXWSUIPlugin plugin;

+	

+	/**

+	 * The constructor

+	 */

+	public JAXWSUIPlugin() {

+	}

+

+	/*

+	 * (non-Javadoc)

+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)

+	 */

+	public void start(BundleContext context) throws Exception {

+		super.start(context);

+		plugin = this;

+	}

+

+	/*

+	 * (non-Javadoc)

+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)

+	 */

+	public void stop(BundleContext context) throws Exception {

+		plugin = null;

+		super.stop(context);

+	}

+

+	/**

+	 * Returns the shared instance

+	 *

+	 * @return the shared instance

+	 */

+	public static JAXWSUIPlugin getDefault() {

+		return plugin;

+	}

+

+	/**

+	 * Returns an image descriptor for the image file at the given

+	 * plug-in relative path

+	 *

+	 * @param path the path

+	 * @return the image descriptor

+	 */

+	public static ImageDescriptor getImageDescriptor(String path) {

+		return imageDescriptorFromPlugin(PLUGIN_ID, path);

+	}

+	

+    public static void logMessage(int severity, String message) {

+        JAXWSUIPlugin.log(new Status(severity, JAXWSUIPlugin.PLUGIN_ID, message));

+    }

+

+    public static void log(IStatus status) {

+        JAXWSUIPlugin.getDefault().getLog().log(status);

+    }

+

+    public static void log(Throwable exception) {

+        JAXWSUIPlugin.log(new Status(IStatus.ERROR, JAXWSUIPlugin.PLUGIN_ID, exception.getLocalizedMessage(),

+                exception));

+    }

+}

diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/actions/AnnotationsViewFilterAction.java b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/actions/AnnotationsViewFilterAction.java
new file mode 100644
index 0000000..874d17e
--- /dev/null
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/actions/AnnotationsViewFilterAction.java
@@ -0,0 +1,96 @@
+ /*******************************************************************************
+ * Copyright (c) 2009 Shane Clarke.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Shane Clarke - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ws.internal.jaxws.ui.actions;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jst.ws.internal.jaxws.core.annotations.AnnotationsManager;
+import org.eclipse.jst.ws.internal.jaxws.ui.JAXWSUIMessages;
+import org.eclipse.jst.ws.internal.jaxws.ui.JAXWSUIPlugin;
+import org.eclipse.jst.ws.internal.jaxws.ui.views.AnnotationsView;
+import org.eclipse.jst.ws.internal.jaxws.ui.views.AnnotationsViewCategoryFilter;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.dialogs.ListSelectionDialog;
+
+/**
+ * @author sclarke
+ *
+ */
+public class AnnotationsViewFilterAction extends Action {
+    private StructuredViewer viewer;
+    private AnnotationsViewCategoryFilter categoryFilter;
+    
+    public AnnotationsViewFilterAction(AnnotationsView annotationsView, StructuredViewer viewer, String text) {
+        super(text);
+        this.viewer = viewer;
+        this.setImageDescriptor(JAXWSUIPlugin.getImageDescriptor("icons/elcl16/filter_ps.gif")); //$NON-NLS-1$
+        categoryFilter = new AnnotationsViewCategoryFilter(annotationsView, viewer);
+    }
+
+    @Override
+    public void run() {
+        ListSelectionDialog listSelectionDialog = new ListSelectionDialog(viewer.getControl().getShell(),
+                AnnotationsManager.getAnnotationCategories(), new AnnotationsCategoryDialogContentProvider(),
+                new AnnotationsCategoryDialogLabelProvider(), 
+                JAXWSUIMessages.ANNOTATIONS_VIEW_FILTER_ACTION_SELECT_CATEGORIES_MESSAGE);
+        
+        listSelectionDialog.setInitialElementSelections(categoryFilter.getCategories());
+        
+        int returnValue = listSelectionDialog.open();
+        if (returnValue == Window.OK) {
+            Object[] result = listSelectionDialog.getResult();
+            categoryFilter.filterAnnotations(Arrays.asList(result));
+        }
+    }
+    
+    public void init(IMemento memento) {
+        categoryFilter.init(memento);
+    }
+    
+    public void saveState(IMemento memento) {
+        categoryFilter.saveState(memento);
+    }
+    
+    private static class AnnotationsCategoryDialogContentProvider implements IStructuredContentProvider {
+
+        public Object[] getElements(Object inputElement) {
+            if (inputElement instanceof List) {
+                return ((List<String>)inputElement).toArray();
+            }
+            return new Object[] {};
+        }
+
+        public void dispose() {
+        }
+
+        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+        }
+        
+    }
+    
+    private static class AnnotationsCategoryDialogLabelProvider extends LabelProvider {
+        public String getText(Object element) {
+            return element.toString();
+        }
+
+        public Image getImage(Object element) {
+            return null;
+        }
+    }
+}
diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationArrayCellEditor.java b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationArrayCellEditor.java
new file mode 100644
index 0000000..fc8e7a4
--- /dev/null
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationArrayCellEditor.java
@@ -0,0 +1,545 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Shane Clarke.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Shane Clarke - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ws.internal.jaxws.ui.views;
+
+/**
+ * @author sclarke
+ */
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.Map.Entry;
+
+import org.eclipse.jdt.core.IAnnotation;
+import org.eclipse.jdt.core.IMemberValuePair;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.search.SearchEngine;
+import org.eclipse.jdt.ui.IJavaElementSearchConstants;
+import org.eclipse.jdt.ui.ISharedImages;
+import org.eclipse.jdt.ui.JavaUI;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.viewers.DialogCellEditor;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jst.ws.internal.jaxws.ui.JAXWSUIMessages;
+import org.eclipse.jst.ws.internal.jaxws.ui.JAXWSUIPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+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.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.SelectionDialog;
+import org.eclipse.ui.dialogs.SelectionStatusDialog;
+
+public class AnnotationArrayCellEditor extends DialogCellEditor {
+    private Method method;
+    private Object[] values;
+
+    private List<Object> originalValues;
+    private List<Object> updatedValues;
+
+    private  AnnotationArrayDialog annotationArrayDialog;
+    
+    boolean cancelled;
+    
+    public AnnotationArrayCellEditor(Composite parent, Object[] values) {
+        super(parent, SWT.NONE);
+        this.values = values.clone();
+    }
+
+    @Override
+    protected Object openDialogBox(Control cellEditorWindow) {
+        annotationArrayDialog = new AnnotationArrayDialog(cellEditorWindow.getShell(), values);
+        int returnValue = annotationArrayDialog.open();
+        
+        if (returnValue == Window.OK) {
+            cancelled = false;
+            return annotationArrayDialog.getResult();
+        } if (returnValue == Window.CANCEL) {
+            cancelled = true;
+        }
+        return values;
+    }
+    
+    public void setMethod(Method method) {
+        this.method = method;
+    }
+    
+    @Override
+    protected void updateContents(Object value) {
+        if (value instanceof Object[]) {
+            Object[] values = (Object[])value;
+            if (values.length > 0) {
+                getDefaultLabel().setText("[]{...}");     //$NON-NLS-1$
+            } else {
+                getDefaultLabel().setText("[]{}"); //$NON-NLS-1$
+            }
+        }
+    }
+
+    @Override
+    protected Object doGetValue() {
+        if (cancelled || updatedValues == null) {
+            return originalValues != null ? originalValues.toArray() : new Object[0];
+        }
+        return updatedValues.toArray();
+    }
+
+    @Override
+    protected void doSetValue(Object value) {
+        super.doSetValue(value);
+        this.values = (Object[])value;
+    }
+
+    private class AnnotationArrayDialog extends SelectionStatusDialog {
+        private Button addButton;
+        private Button removeButton;
+        private Button upButton;
+        private Button downButton;
+        private Table arrayValuesTable;
+        private TableViewer arrayValuesTableViewer;
+        
+        private Map<String, Control> controls = new HashMap<String, Control>();
+                
+        public AnnotationArrayDialog(Shell parent, Object[] values) {
+            super(parent);
+            setValues(values);
+            setTitle(JAXWSUIMessages.ANNOTATION_ARRAY_CELL_EDITOR_EDIT_ARRAY_VALUES_TITLE);
+        }
+
+        private void setValues(Object[] values) {
+            try {
+                originalValues = new ArrayList<Object>();
+                updatedValues = new ArrayList<Object>();
+                for (Object value : values) {
+                    if (value instanceof IAnnotation) {
+                        IAnnotation annotation = (IAnnotation)value;
+                        IMemberValuePair[] memberValuePairs = annotation.getMemberValuePairs();
+                        if (memberValuePairs.length > 0) {
+                            List<Map<String, Object>> aList = new ArrayList<Map<String,Object>>();
+                            for (IMemberValuePair memberValuePair : memberValuePairs) {
+                                String memberName = memberValuePair.getMemberName();
+                                Object memberValue = memberValuePair.getValue();
+                                Map<String, Object> mvps = new HashMap<String, Object>();
+                                if (memberValuePair.getValueKind() == IMemberValuePair.K_STRING) {
+                                    mvps.put(memberName, memberValue);
+                                }
+
+                                if (memberValuePair.getValueKind() == IMemberValuePair.K_CLASS) {
+                                    mvps.put(memberName, memberValuePair.getValue() + ".class"); //$NON-NLS-1$
+                                }
+                                aList.add(mvps);
+                            }
+                            originalValues.add(aList);
+                            updatedValues.add(aList);
+                        }
+                    }
+                    if (value.equals(Class.class)) {
+                        originalValues.add(value);
+                        updatedValues.add(value);                        
+                    }
+                    if (value instanceof String) {
+                        String string = (String)value;
+                        originalValues.add(string);
+                        updatedValues.add(string);
+                    }
+                }
+            } catch (JavaModelException jme) {
+                JAXWSUIPlugin.log(jme.getStatus());
+            }
+        }
+        
+        @Override
+        protected Control createDialogArea(Composite parent) {
+            Composite mainComposite = (Composite) super.createDialogArea(parent);
+            
+            GridLayout gridLayout = new GridLayout(3, false);
+            mainComposite.setLayout(gridLayout);
+
+            GridData gridData = new GridData(SWT.FILL, SWT.BEGINNING, false, false);
+            gridData.widthHint = 800;
+            mainComposite.setLayoutData(gridData);
+            
+            Composite typeComposite = new Composite(mainComposite, SWT.NONE);
+            gridLayout = new GridLayout(3, false);
+            typeComposite.setLayout(gridLayout);
+            gridData = new GridData(SWT.FILL, SWT.BEGINNING, true, true);
+            typeComposite.setLayoutData(gridData);
+            
+            final Class<?> componentType = method.getReturnType().getComponentType();
+            if (componentType.isAnnotation()) {
+                Label compontTypeLabel = new Label(typeComposite, SWT.NONE);
+                compontTypeLabel.setText("@" + componentType.getName()); //$NON-NLS-1$
+                gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
+                gridData.horizontalSpan = 3;
+                compontTypeLabel.setLayoutData(gridData);
+
+                Method[] methods = componentType.getDeclaredMethods();
+                for (Method method : methods) {
+                    Label label = new Label(typeComposite, SWT.NONE);
+                    label.setText(method.getName() + ":"); //$NON-NLS-1$
+                    createEntryFields(method, typeComposite);
+                }
+            } else {
+                Label label = new Label(typeComposite, SWT.NONE);
+                label.setText(componentType.getSimpleName());
+                createEntryFields(method, typeComposite);
+            }
+
+            Composite buttonComposite = new Composite(mainComposite, SWT.NONE);
+            gridLayout = new GridLayout(1, false);
+            buttonComposite.setLayout(gridLayout);
+            
+            addButton = new Button(buttonComposite, SWT.PUSH);
+            addButton.setText(JAXWSUIMessages.ANNOTATION_ARRAY_CELL_EDITOR_ADD_LABEL);
+            addButton.addSelectionListener(new SelectionAdapter() {
+                @Override
+                public void widgetSelected(SelectionEvent event) {
+                    Set<Entry<String, Control>> entrySet = controls.entrySet();
+                    Iterator<Map.Entry<String, Control>> iterator = entrySet.iterator();
+                    List<Map<String, Object>> aList = new ArrayList<Map<String,Object>>();
+                    while (iterator.hasNext()) {
+                        Map.Entry<String, Control> entry = iterator.next();
+                        if (entry.getValue() instanceof Text) {
+                            Text textField = (Text) entry.getValue();
+                            Method method = (Method) textField.getData();
+                            if (textField.getText().trim().length() > 0) {
+                                if (componentType.isAnnotation()) {
+                                    Map<String, Object> memberValuePairs = new HashMap<String, Object>();
+                                    memberValuePairs.put(method.getName(), textField.getText());
+                                    aList.add(memberValuePairs);
+                                } else {
+                                    updatedValues.add(textField.getText());
+                                }
+                            }
+                        }
+                        if (entry.getValue() instanceof Button) {
+                            Button button = (Button)entry.getValue();
+                         //   if (button..getStyle() == SWT.CHECK) {
+                                Method method = (Method) button.getData();
+                                if (componentType.isAnnotation()) {
+                                    Map<String, Object> memberValuePairs = new HashMap<String, Object>();
+                                    memberValuePairs.put(method.getName(), button.getSelection());
+                                    aList.add(memberValuePairs);
+                                } else {
+                                    updatedValues.add(button.getSelection());
+                                }
+                        //    }
+                        }
+                        
+                    }
+                    if (aList.size() > 0) {
+                        updatedValues.add(aList);
+                    }
+                    arrayValuesTableViewer.refresh();
+                }
+            });
+            gridData = new GridData(SWT.FILL, SWT.FILL, true, false);
+            addButton.setLayoutData(gridData);
+            
+            removeButton = new Button(buttonComposite, SWT.PUSH);
+            removeButton.setText(JAXWSUIMessages.ANNOTATION_ARRAY_CELL_EDITOR_REMOVE_LABEL);
+            removeButton.addSelectionListener(new SelectionAdapter() {
+                @Override
+                public void widgetSelected(SelectionEvent event) {
+                    ISelection selection = arrayValuesTableViewer.getSelection();
+                    if (selection != null && !selection.isEmpty()) {
+                        int index = arrayValuesTable.getSelectionIndex();
+                        updatedValues.remove(index);
+                        arrayValuesTableViewer.refresh();
+                    }
+                }
+            });
+            gridData = new GridData(SWT.FILL, SWT.FILL, true, false);
+            removeButton.setLayoutData(gridData);
+            
+            upButton = new Button(buttonComposite, SWT.PUSH);
+            upButton.setText(JAXWSUIMessages.ANNOTATION_ARRAY_CELL_EDITOR_UP_LABEL);
+            upButton.addSelectionListener(new SelectionAdapter() {
+                @Override
+                public void widgetSelected(SelectionEvent e) {
+                    moveSelectedElememtUp(getSelectedElement(), getTableViewer());
+                 }
+            });
+            
+            gridData = new GridData(SWT.FILL, SWT.FILL, true, false);
+            upButton.setLayoutData(gridData);
+            
+            downButton = new Button(buttonComposite, SWT.PUSH);
+            downButton.setText(JAXWSUIMessages.ANNOTATION_ARRAY_CELL_EDITOR_DOWN_LABEL);
+            downButton.addSelectionListener(new SelectionAdapter() {
+                @Override
+                public void widgetSelected(SelectionEvent e) {
+                    moveSelectedElememtDown(getSelectedElement(), getTableViewer());
+                }
+            });
+            gridData = new GridData(SWT.FILL, SWT.FILL, true, false);
+            downButton.setLayoutData(gridData);
+            
+            Composite valuesComposite = new Composite(mainComposite, SWT.NONE);
+            gridLayout = new GridLayout(1, false);
+            valuesComposite.setLayout(gridLayout);
+            gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
+            gridData.widthHint = 200;
+            valuesComposite.setLayoutData(gridData);
+            
+            Label valuesLabel = new Label(valuesComposite, SWT.NONE);
+            valuesLabel.setText(method.getName() + ":"); //$NON-NLS-1$
+            
+            arrayValuesTableViewer = new TableViewer(valuesComposite, SWT.BORDER | SWT.SINGLE | SWT.V_SCROLL 
+                    | SWT.H_SCROLL);
+            arrayValuesTableViewer.setLabelProvider(new LabelProvider() {
+                @Override
+                public String getText(Object element) {
+                    if (element instanceof List) {
+                        String annotationName = method.getReturnType().getComponentType().getSimpleName();
+                        annotationName += "("; //$NON-NLS-1$
+                        List<Map<String, Object>> valuesList = (List<Map<String, Object>>)element;
+                        Iterator<Map<String, Object>> valuesIterator = valuesList.iterator();
+                        while (valuesIterator.hasNext()) {
+                            Map<String, Object> valuesMap = (Map<String, Object>)valuesIterator.next();
+                            Set<Entry<String, Object>> entrySet = valuesMap.entrySet();
+                            Iterator<Map.Entry<String, Object>> iterator = entrySet.iterator();
+                            while (iterator.hasNext()) {
+                                Map.Entry<String, Object> entry = iterator.next();
+                                Object value = entry.getValue();
+                                boolean isString = (value instanceof String && !value.toString().
+                                        endsWith(".class")); //$NON-NLS-1$
+                                if (isString) {
+                                    annotationName += entry.getKey() + "=\"" + value + "\""; //$NON-NLS-1$ //$NON-NLS-2$
+                                } else {
+                                    annotationName += entry.getKey() + "=" + value; //$NON-NLS-1$
+                                }
+                            }
+                            if (valuesIterator.hasNext()) {
+                                annotationName += ", "; //$NON-NLS-1$
+                            }
+                        }
+                        return annotationName += ")"; //$NON-NLS-1$
+                    }
+                    return element.toString();
+                }
+
+                @Override
+                public Image getImage(Object element) {
+                    Class<?> returnType = method.getReturnType();
+                    if (returnType.getComponentType().isAnnotation()) {
+                        return JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_ANNOTATION);
+                    } if (returnType.equals(Class.class)) {
+                        return JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_CLASS);
+                    } else {
+                        return PlatformUI.getWorkbench().getSharedImages().getImage(
+                                org.eclipse.ui.ISharedImages.IMG_OBJ_FILE);
+                    }
+                }
+            });
+            
+            arrayValuesTableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+                public void selectionChanged(SelectionChangedEvent event) {
+                    int index = arrayValuesTable.getSelectionIndex();
+                    int itemCount = arrayValuesTable.getItemCount();
+                    if (index > 1) {
+                        upButton.setEnabled(false);
+                        downButton.setEnabled(true);
+                    } else if (index == values.length -1) {
+                        upButton.setEnabled(true);
+                        downButton.setEnabled(false);
+                    } else {
+                        upButton.setEnabled(true);
+                        downButton.setEnabled(true);
+                    }
+                    if (itemCount <=  1) {
+                        upButton.setEnabled(false);
+                        downButton.setEnabled(false);
+                    }
+                    if (itemCount > 0) {
+                        removeButton.setEnabled(true);
+                    } else {
+                        removeButton.setEnabled(false);
+                    }
+                }                
+            });
+            
+            arrayValuesTableViewer.setContentProvider(new ArrayValuesContentProvider());
+
+            arrayValuesTable = arrayValuesTableViewer.getTable();
+            gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
+            arrayValuesTable.setLayoutData(gridData);
+
+            arrayValuesTableViewer.setInput(values);
+
+            upButton.setEnabled(false);
+            downButton.setEnabled(false);
+            removeButton.setEnabled(false);
+
+            return mainComposite;
+        }
+        
+        public void createEntryFields(Method method, Composite typeComposite) {
+           //TODO Handle ENUMS 
+            Class<?> returnType = method.getReturnType();
+            Object defaultValue = method.getDefaultValue();
+            GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
+            if (returnType.equals(String.class)) {
+                Text text = new Text(typeComposite, SWT.BORDER);
+                text.setData(method);
+                gridData.horizontalSpan = 2;
+                text.setLayoutData(gridData);
+                if (defaultValue != null) {
+                    text.setText(defaultValue.toString());
+                }
+                controls.put(method.getName(), text);
+            }
+            if (returnType.equals(Class.class)) {
+                final Text text = new Text(typeComposite, SWT.BORDER);
+                text.setData(method);
+                gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
+                text.setLayoutData(gridData);
+                if (defaultValue != null) {
+                    Class<?> classValue = (Class<?>)defaultValue;
+                    text.setText(classValue.getCanonicalName() + ".class");    
+                }
+                Button browseClassButton = new Button(typeComposite, SWT.PUSH);
+                browseClassButton.setText(JAXWSUIMessages.ANNOTATION_ARRAY_CELL_EDITOR_BROWSE_LABEL);
+                browseClassButton.addSelectionListener(new SelectionAdapter() {
+                    @Override
+                    public void widgetSelected(SelectionEvent e) {
+                        SelectionDialog dialog = getClassSelectionDialog();
+                        dialog.setTitle(JAXWSUIMessages.ANNOTATION_ARRAY_CELL_EDITOR_SELECT_CLASS_TITLE);
+                        if (dialog.open() == IDialogConstants.OK_ID) {
+                            Object[] types = dialog.getResult();
+                            
+                            if (types != null && types.length > 0) {
+                                IType type = (IType)types[0];
+                                if (type.isBinary()) {
+                                    text.setText(type.getClassFile().getElementName());
+                                }
+                            }
+                        }
+                    }
+                });
+                controls.put(method.getName(), text);
+            }
+            if (returnType.isArray()) {
+                Label notSupportLabel = new Label(typeComposite, SWT.NONE);
+                notSupportLabel.setText(
+                        JAXWSUIMessages.ANNOTATION_ARRAY_CELL_EDITOR_NESTED_ARRAYS_NOT_SUPPORTED);
+                gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
+                gridData.horizontalSpan = 2;
+                notSupportLabel.setLayoutData(gridData);
+            }
+            if (returnType.equals(Boolean.TYPE)) {
+                Button checkbox = new Button(typeComposite, SWT.CHECK);
+                checkbox.setData(method);
+                gridData.horizontalSpan = 2;
+                checkbox.setLayoutData(gridData);
+                if (defaultValue != null) {
+                    checkbox.setSelection((Boolean)defaultValue);
+                }
+                controls.put(method.getName(), checkbox);
+            }
+        }
+        
+        public Object getSelectedElement() {
+            IStructuredSelection selection= (IStructuredSelection) arrayValuesTableViewer.getSelection();
+            return selection.getFirstElement();
+        }
+        
+        private TableViewer getTableViewer() {
+            return arrayValuesTableViewer;
+        }
+        
+        public void moveSelectedElememtUp(Object selected, TableViewer tableViewer) {
+            int selectionIndex = tableViewer.getTable().getSelectionIndex();
+            if (selectionIndex > 0) {
+                updatedValues.remove(selected);
+                updatedValues.add(selectionIndex - 1, selected);
+                
+                tableViewer.refresh();
+                tableViewer.reveal(selected);
+                tableViewer.setSelection(new StructuredSelection(selected));
+            }
+        }
+        
+        public void moveSelectedElememtDown(Object selected, TableViewer tableViewer) {
+            int selectionIndex = tableViewer.getTable().getSelectionIndex();
+            int itemCount = tableViewer.getTable().getItemCount();
+            if (selectionIndex < itemCount - 1) {
+                updatedValues.remove(selected);
+                updatedValues.add(selectionIndex + 1, selected);
+                
+                tableViewer.refresh();
+                tableViewer.reveal(selected);
+                tableViewer.setSelection(new StructuredSelection(selected));
+            }
+        }
+
+        private class ArrayValuesContentProvider implements IStructuredContentProvider {
+            
+            public ArrayValuesContentProvider() {
+            }
+            
+            public Object[] getElements(Object inputElement) {
+                return updatedValues.toArray();
+            }
+
+            public void dispose() {
+            }
+
+            public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+            }            
+        }
+        
+        public SelectionDialog getClassSelectionDialog() {
+            try {
+                return JavaUI.createTypeDialog(getShell(), PlatformUI.getWorkbench().getProgressService(), 
+                        SearchEngine.createWorkspaceScope(), IJavaElementSearchConstants.CONSIDER_CLASSES, 
+                        false, "* "); //$NON-NLS-1$
+            } catch (JavaModelException jme) {
+                JAXWSUIPlugin.log(jme.getStatus());
+            }
+            return null;
+        }
+        
+        
+        @Override
+        public Object[] getResult() {
+            return updatedValues.toArray();
+        }
+
+        @Override
+        protected void computeResult() {
+        }
+    }
+
+}
diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsColumnLabelProvider.java b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsColumnLabelProvider.java
new file mode 100755
index 0000000..f46f649
--- /dev/null
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsColumnLabelProvider.java
@@ -0,0 +1,51 @@
+/*******************************************************************************

+ * Copyright (c) 2009 Shane Clarke.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *    Shane Clarke - initial API and implementation

+ *******************************************************************************/

+package org.eclipse.jst.ws.internal.jaxws.ui.views;

+

+import java.lang.reflect.Method;

+

+import org.eclipse.jdt.ui.ISharedImages;

+import org.eclipse.jdt.ui.JavaUI;

+import org.eclipse.jface.viewers.ColumnLabelProvider;

+import org.eclipse.swt.graphics.Image;

+import org.eclipse.ui.PlatformUI;

+

+/**

+ * 

+ * @author sclarke

+ *

+ */

+public class AnnotationsColumnLabelProvider extends ColumnLabelProvider {

+

+    @Override

+    public String getText(Object element) {

+        if (element instanceof Class) {

+            return ((Class<?>)element).getName();

+        }

+        

+        if (element instanceof Method) {

+            return ((Method)element).getName();

+        }

+        return ""; //$NON-NLS-1$

+    }

+

+    @Override

+    public Image getImage(Object element) {

+        if (element instanceof Class) {

+            return JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_ANNOTATION);

+        }

+        if (element instanceof Method) {

+            return PlatformUI.getWorkbench().getSharedImages().getImage(

+                    org.eclipse.ui.ISharedImages.IMG_OBJ_FILE);

+        }

+        return null;

+    }

+}

diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsValuesColumnLabelProvider.java b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsValuesColumnLabelProvider.java
new file mode 100644
index 0000000..61cf40b
--- /dev/null
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsValuesColumnLabelProvider.java
@@ -0,0 +1,280 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Shane Clarke.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Shane Clarke - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ws.internal.jaxws.ui.views;
+
+import java.lang.reflect.Method;
+import java.util.List;
+
+import org.eclipse.jdt.core.IAnnotatable;
+import org.eclipse.jdt.core.IAnnotation;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IMemberValuePair;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.dom.Annotation;
+import org.eclipse.jdt.core.dom.BooleanLiteral;
+import org.eclipse.jdt.core.dom.IExtendedModifier;
+import org.eclipse.jdt.core.dom.MemberValuePair;
+import org.eclipse.jdt.core.dom.NormalAnnotation;
+import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
+import org.eclipse.jdt.core.dom.StringLiteral;
+import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jst.ws.internal.jaxws.core.utils.AnnotationUtils;
+import org.eclipse.jst.ws.internal.jaxws.ui.JAXWSUIPlugin;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * 
+ * @author sclarke
+ *
+ */
+public class AnnotationsValuesColumnLabelProvider extends ColumnLabelProvider {
+    private TreeViewer annotationTreeViewer;
+    private Image true_image;
+    private Image false_image;
+    
+    public AnnotationsValuesColumnLabelProvider(TreeViewer annotationTreeViewer) {
+        this.annotationTreeViewer = annotationTreeViewer;
+        true_image = JAXWSUIPlugin.imageDescriptorFromPlugin(JAXWSUIPlugin.PLUGIN_ID, "icons/obj16/true.gif") //$NON-NLS-1$
+                .createImage();
+        false_image = JAXWSUIPlugin.imageDescriptorFromPlugin(JAXWSUIPlugin.PLUGIN_ID, "icons/obj16/false.gif") //$NON-NLS-1$
+                .createImage();
+    }
+    
+    @Override
+    public String getText(Object element) {
+        String text = ""; //$NON-NLS-1$
+        if (element instanceof Method) {
+            text =  getTextForMethod((Method)element);
+        }
+        return text;
+    }
+    
+    private String getTextForMethod(Method method) {
+        String text = ""; //$NON-NLS-1$
+        if (annotationTreeViewer.getInput() instanceof IAnnotatable) {
+            text = getTextForMethod(method, (IAnnotatable) annotationTreeViewer.getInput());
+        } else if (annotationTreeViewer.getInput() instanceof SingleVariableDeclaration) {
+            text = getTextForMethod(method, (SingleVariableDeclaration)annotationTreeViewer.getInput());
+        }
+        return text;
+    }
+
+    private String getTextForMethod(Method method, IAnnotatable annotatedElement) {
+        Class<?> returnType = method.getReturnType();
+        try {
+            IAnnotation[] annotations = annotatedElement.getAnnotations();
+            for (IAnnotation annotation : annotations) {
+                Class<?> declaringClass = method.getDeclaringClass();
+                if (annotation.getElementName().equals(declaringClass.getSimpleName())
+                        || annotation.getElementName().equals(declaringClass.getCanonicalName())) {
+                    IMemberValuePair[] memberValuePairs = annotation.getMemberValuePairs();
+                    for (IMemberValuePair memberValuePair : memberValuePairs) {
+                        if (memberValuePair.getMemberName().equals(method.getName())) {
+                            if (returnType.equals(String.class)) {
+                                return memberValuePair.getValue().toString();
+                            }
+                            
+                            if (returnType.equals(Class.class)) {
+                                return memberValuePair.getValue().toString() + ".class";  //$NON-NLS-1$
+                            }
+                            if (returnType.isPrimitive() && (returnType.equals(Byte.TYPE) 
+                                    || returnType.equals(Short.TYPE) 
+                                    || returnType.equals(Integer.TYPE) || returnType.equals(Long.TYPE)
+                                    || returnType.equals(Float.TYPE) 
+                                    || returnType.equals(Double.TYPE))) {
+                                return memberValuePair.getValue().toString();
+                            }
+                            
+                            if (returnType.isArray()) {
+                                Object[] values = (Object[])memberValuePair.getValue();
+                                if (values != null && values.length > 0) {
+                                    return "[]{...}"; //$NON-NLS-1$
+                                } else {
+                                    return "[]{}"; //$NON-NLS-1$
+                                }
+                            }
+                            
+                            if (returnType.isEnum()) {
+                                String enumValue = memberValuePair.getValue().toString();
+                                return enumValue.substring(enumValue.lastIndexOf(".") + 1); //$NON-NLS-1$
+                            }
+                        }
+                    }
+                }
+            }
+        } catch (JavaModelException jme) {
+            JAXWSUIPlugin.log(jme.getStatus());
+        }
+        return ""; //$NON-NLS-1$
+    }
+
+    @SuppressWarnings("unchecked")
+    private String getTextForMethod(Method method, SingleVariableDeclaration singleVariableDeclaration) {
+        Class<?> returnType = method.getReturnType();
+        List<IExtendedModifier> modifiers = singleVariableDeclaration.modifiers();
+        for (IExtendedModifier extendedModifier : modifiers) {
+            if (extendedModifier instanceof NormalAnnotation) {
+                NormalAnnotation normalAnnotation = (NormalAnnotation) extendedModifier;
+                String annotationName = AnnotationUtils.getAnnotationName(normalAnnotation);
+                Class<?> declaringClass = method.getDeclaringClass();
+                if (annotationName.equals(declaringClass.getSimpleName()) || 
+                        annotationName.equals(declaringClass.getCanonicalName())) {
+                    List<MemberValuePair> memberValuePairs = normalAnnotation.values();
+                    for (MemberValuePair memberValuePair : memberValuePairs) {
+                        if (memberValuePair.getName().toString().equals(method.getName())) {
+                            if (returnType.equals(String.class)) {
+                                StringLiteral stringLiteral = (StringLiteral)memberValuePair.getValue();
+                                return stringLiteral.getLiteralValue();
+                            }
+
+                            if (returnType.isPrimitive() && (returnType.equals(Byte.TYPE) 
+                                    || returnType.equals(Short.TYPE) 
+                                    || returnType.equals(Integer.TYPE) || returnType.equals(Long.TYPE)
+                                    || returnType.equals(Float.TYPE) 
+                                    || returnType.equals(Double.TYPE))) {
+                                return memberValuePair.getValue().toString();
+                            }
+
+                            if (returnType.isEnum()) {
+                                String enumValue = memberValuePair.getValue().toString();
+                                return enumValue.substring(enumValue.lastIndexOf(".") + 1); //$NON-NLS-1$
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return ""; //$NON-NLS-1$
+    }
+    
+    @Override
+    public Image getImage(Object element) {
+        try {
+            if (element instanceof Class) {
+                return getImageForClass((Class<?>) element);
+            }
+            if (element instanceof Method) {
+                return getImageForMethod((Method) element);
+            }
+        } catch (JavaModelException jme) {
+            JAXWSUIPlugin.log(jme.getStatus());
+        }
+        return null;
+    }
+        
+    private Image getImageForClass(Class<?> aClass) throws JavaModelException {
+        if (annotationTreeViewer.getInput() instanceof IAnnotatable) {
+            return getImageForClass(aClass, (IAnnotatable) annotationTreeViewer.getInput());
+        }
+        
+        if (annotationTreeViewer.getInput() instanceof SingleVariableDeclaration) {
+            return getImageForClass(aClass, (SingleVariableDeclaration)annotationTreeViewer.getInput());
+        }
+        return false_image;        
+    }
+    
+    private Image getImageForClass(Class<?> aClass, IAnnotatable annotatedElement) throws JavaModelException {
+        IAnnotation[] annotations = annotatedElement.getAnnotations();
+        for (IAnnotation annotation : annotations) {
+            String annotationName = annotation.getElementName();
+            if (AnnotationUtils.isAnnotationPresent((IJavaElement)annotatedElement, annotationName) && 
+                    (annotationName.equals(aClass.getSimpleName()) || 
+                    annotationName.equals(aClass.getCanonicalName()))) {
+                return true_image;
+            }
+        }
+        return false_image;
+    }
+    
+    @SuppressWarnings("unchecked")
+    private Image getImageForClass(Class<?> aClass, SingleVariableDeclaration parameter) {
+        List<IExtendedModifier> modifiers = parameter.modifiers();
+        for (IExtendedModifier extendedModifier : modifiers) {
+            if (extendedModifier instanceof Annotation) {
+                Annotation annotation = (Annotation) extendedModifier;
+                String annotationName = AnnotationUtils.getAnnotationName(annotation);
+                if (AnnotationUtils.isAnnotationPresent(parameter, annotation)
+                        && (annotationName.equals(aClass.getSimpleName())
+                        || annotationName.equals(aClass.getCanonicalName()))) {
+                    return true_image;
+                }
+            }
+        }
+        return false_image;
+    }
+    
+    private Image getImageForMethod(Method method) throws JavaModelException {
+        Class<?> returnType = method.getReturnType();
+        if (returnType.equals(Boolean.TYPE)) {
+            if (annotationTreeViewer.getInput() instanceof IAnnotatable) {
+                return getImageForMethod(method, (IAnnotatable) annotationTreeViewer.getInput());
+            }
+            if (annotationTreeViewer.getInput() instanceof SingleVariableDeclaration) {
+                return getImageForMethod(method, (SingleVariableDeclaration)annotationTreeViewer.getInput());
+            }
+        }
+        return null;
+    }
+
+    private Image getImageForMethod(Method method, IAnnotatable annotatedElement) throws JavaModelException {
+        IAnnotation[] annotations = annotatedElement.getAnnotations();
+        for (IAnnotation annotation : annotations) {
+            String annotationName = annotation.getElementName();
+            Class<?> declaringClass = method.getDeclaringClass();
+            if (annotationName.equals(declaringClass.getSimpleName())
+                    || annotationName.equals(declaringClass.getCanonicalName())) {
+                IMemberValuePair[] memberValuePairs = annotation.getMemberValuePairs();
+                for (IMemberValuePair memberValuePair : memberValuePairs) {
+                    if (memberValuePair.getMemberName().equals(method.getName())) {
+                        if (Boolean.parseBoolean(memberValuePair.getValue().toString())) {
+                            return true_image;
+                        }
+                    }
+                }
+            }
+        }
+        return false_image;
+    }
+    
+    @SuppressWarnings("unchecked")
+    private Image getImageForMethod(Method method, SingleVariableDeclaration singleVariableDeclaration) 
+            throws JavaModelException {
+        List<IExtendedModifier> modifiers = singleVariableDeclaration.modifiers();
+        for (IExtendedModifier extendedModifier : modifiers) {
+            if (extendedModifier instanceof NormalAnnotation) {
+                NormalAnnotation annotation = (NormalAnnotation) extendedModifier;
+                String annotationName = AnnotationUtils.getAnnotationName(annotation);
+                Class<?> declaringClass = method.getDeclaringClass();
+                if (annotationName.equals(declaringClass.getSimpleName())
+                        || annotationName.equals(declaringClass.getCanonicalName())) {
+                    List<MemberValuePair> memberValuePairs = annotation.values();
+                    for (MemberValuePair memberValuePair : memberValuePairs) {
+                        if (memberValuePair.getName().toString().equals(method.getName())) {
+                            BooleanLiteral booleanLiteral = (BooleanLiteral)memberValuePair.getValue();
+                            if (booleanLiteral.booleanValue()) {
+                                return true_image;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return false_image;
+    }
+
+    @Override
+    public void dispose() {
+        super.dispose();
+        true_image.dispose();
+        false_image.dispose();
+    }
+}
diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsValuesEditingSupport.java b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsValuesEditingSupport.java
new file mode 100644
index 0000000..237874b
--- /dev/null
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsValuesEditingSupport.java
@@ -0,0 +1,725 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Shane Clarke.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Shane Clarke - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ws.internal.jaxws.ui.views;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.IAnnotatable;
+import org.eclipse.jdt.core.IAnnotation;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IField;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IMember;
+import org.eclipse.jdt.core.IMemberValuePair;
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.IPackageDeclaration;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.dom.AST;
+import org.eclipse.jdt.core.dom.ASTNode;
+import org.eclipse.jdt.core.dom.Annotation;
+import org.eclipse.jdt.core.dom.BooleanLiteral;
+import org.eclipse.jdt.core.dom.CompilationUnit;
+import org.eclipse.jdt.core.dom.IExtendedModifier;
+import org.eclipse.jdt.core.dom.MemberValuePair;
+import org.eclipse.jdt.core.dom.NormalAnnotation;
+import org.eclipse.jdt.core.dom.PackageDeclaration;
+import org.eclipse.jdt.core.dom.QualifiedName;
+import org.eclipse.jdt.core.dom.SimpleName;
+import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
+import org.eclipse.jdt.core.dom.StringLiteral;
+import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;
+import org.eclipse.jdt.internal.ui.actions.WorkbenchRunnableAdapter;
+import org.eclipse.jdt.internal.ui.util.BusyIndicatorRunnableContext;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.CheckboxCellEditor;
+import org.eclipse.jface.viewers.ComboBoxCellEditor;
+import org.eclipse.jface.viewers.EditingSupport;
+import org.eclipse.jface.viewers.ICellEditorValidator;
+import org.eclipse.jface.viewers.TextCellEditor;
+import org.eclipse.jface.viewers.TreePath;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jst.ws.internal.jaxws.core.annotations.AnnotationsCore;
+import org.eclipse.jst.ws.internal.jaxws.core.annotations.AnnotationsManager;
+import org.eclipse.jst.ws.internal.jaxws.core.annotations.IAnnotationAttributeInitializer;
+import org.eclipse.jst.ws.internal.jaxws.core.utils.AnnotationUtils;
+import org.eclipse.jst.ws.internal.jaxws.core.utils.JDTUtils;
+import org.eclipse.jst.ws.internal.jaxws.ui.JAXWSUIMessages;
+import org.eclipse.jst.ws.internal.jaxws.ui.JAXWSUIPlugin;
+import org.eclipse.ltk.core.refactoring.Change;
+import org.eclipse.ltk.core.refactoring.PerformChangeOperation;
+import org.eclipse.ltk.core.refactoring.TextFileChange;
+import org.eclipse.ltk.ui.refactoring.RefactoringUI;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+/**
+ * @author sclarke
+ * 
+ */
+public class AnnotationsValuesEditingSupport extends EditingSupport {
+    private AnnotationsView annotationsView;
+    private TreeViewer treeViewer;
+    
+    private TextCellEditor textCellEditor;
+    private CheckboxCellEditor checkboxCellEditor;
+    private ComboBoxCellEditor comboBoxCellEditor;
+    private ClassDialogCellEditor classDialogCellEditor;
+    private AnnotationArrayCellEditor annotationArrayCellEditor;
+
+    public AnnotationsValuesEditingSupport(AnnotationsView annotationsView, TreeViewer treeViewer) {
+        super(treeViewer);
+        this.treeViewer = treeViewer;
+        this.annotationsView = annotationsView;
+        textCellEditor = new TextCellEditor(treeViewer.getTree());
+        checkboxCellEditor = new CheckboxCellEditor(treeViewer.getTree());
+        comboBoxCellEditor = new ComboBoxCellEditor(treeViewer.getTree(), new String[] {});
+        classDialogCellEditor = new ClassDialogCellEditor(treeViewer.getTree());
+        annotationArrayCellEditor = new AnnotationArrayCellEditor(treeViewer.getTree(), new Object[] {});
+    }
+
+    @Override
+    protected boolean canEdit(Object element) {
+        return true;
+    }
+
+    @Override
+    protected CellEditor getCellEditor(Object element) {
+        if (element instanceof Class) {
+            return checkboxCellEditor;
+        }
+        if (element instanceof Method) {
+            Method method = (Method) element;
+            final Class<?> returnType = method.getReturnType();
+            if (returnType.isEnum()) {
+                Object[] enumConstants = returnType.getEnumConstants();
+                String[] values = new String[enumConstants.length];
+                for (int i = 0; i < enumConstants.length; i++) {
+                    values[i] = enumConstants[i].toString();
+                }
+                comboBoxCellEditor.setItems(values);
+                return comboBoxCellEditor;
+            }
+            if (returnType.equals(Boolean.TYPE)) {
+                return checkboxCellEditor;
+            }
+            
+            if (returnType.equals(Class.class)) {
+                return classDialogCellEditor;
+            }
+            
+            if (returnType.isArray()) {
+                annotationArrayCellEditor.setMethod(method);
+                return annotationArrayCellEditor;
+            }
+            if (returnType.isPrimitive()) {
+                textCellEditor.setValidator(new ICellEditorValidator() {
+                    public String isValid(Object value) {
+                        try {
+                            if (returnType.equals(Byte.TYPE)) {
+                                Byte.parseByte((String) value);
+                            }
+                            if (returnType.equals(Short.TYPE)) {
+                                Short.parseShort((String) value);
+                            }
+                            if (returnType.equals(Integer.TYPE)) {
+                                Integer.parseInt((String) value);
+                            }
+                            if (returnType.equals(Long.TYPE)) {
+                                Long.parseLong((String) value);
+                            }
+                            if (returnType.equals(Float.TYPE)) {
+                                Float.parseFloat((String) value);
+                            }
+                            if (returnType.equals(Double.TYPE)) {
+                                Double.parseDouble((String) value);
+                            }
+                        } catch (NumberFormatException nfe) {
+                            return JAXWSUIMessages.ANNOTATION_EDITING_SUPPORT_NOT_VALID_MESSAGE_PREFIX 
+                                + returnType.getSimpleName();
+                        }
+                        return null;
+                    }
+                });
+                return textCellEditor;
+            }
+            return textCellEditor;
+        }
+        return checkboxCellEditor;
+    }
+    
+    @Override
+    protected Object getValue(Object element) {
+        if (element instanceof Class) {
+            return getValueForClass((Class<?>) element);
+        }
+        if (element instanceof Method) {
+            return getValueForMethod((Method) element);
+        }
+        return null;
+    }
+    
+    private Object getValueForClass(Class<?> aClass) {
+        if (treeViewer.getInput() instanceof IAnnotatable) {
+            return getValueForClass(aClass, (IAnnotatable) treeViewer.getInput());
+        }
+        if (treeViewer.getInput() instanceof SingleVariableDeclaration) {
+            return getValueForClass(aClass, (SingleVariableDeclaration) treeViewer.getInput());
+        }
+        return Boolean.FALSE;
+    }
+    
+    private Object getValueForClass(Class<?> aClass, IAnnotatable annotatedElement) {
+        try {
+            IAnnotation[] annotations = annotatedElement.getAnnotations();
+            for (IAnnotation annotation : annotations) {
+                String annotationName = annotation.getElementName();
+                if (AnnotationUtils.isAnnotationPresent((IJavaElement)annotatedElement, annotationName)
+                        && (annotationName.equals(aClass.getSimpleName())
+                        || annotationName.equals(aClass.getCanonicalName()))) {
+                    return Boolean.TRUE;
+                }
+            }
+        } catch (JavaModelException jme) {
+            JAXWSUIPlugin.log(jme.getStatus());
+        } 
+        return Boolean.FALSE;
+    }
+    
+    @SuppressWarnings("unchecked")
+    private Object getValueForClass(Class<?> aClass, SingleVariableDeclaration parameter) {
+        List<IExtendedModifier> modifiers = parameter.modifiers();
+        for (IExtendedModifier extendedModifier : modifiers) {
+            if (extendedModifier instanceof Annotation) {
+                Annotation annotation = (Annotation) extendedModifier;
+                String annotationName = AnnotationUtils.getAnnotationName(annotation);
+                if (AnnotationUtils.isAnnotationPresent(parameter, annotation)
+                        && (annotationName.equals(aClass.getSimpleName())
+                        || annotationName.equals(aClass.getCanonicalName()))) {
+                    return Boolean.TRUE;
+                }
+            }
+        }
+        return Boolean.FALSE;
+    }
+
+    private Object getValueForMethod(Method method) {
+        Object value = null;
+        try {
+            if (treeViewer.getInput() instanceof IAnnotatable) {
+                value = getValueForMethod(method, (IAnnotatable) treeViewer.getInput());
+            } else if (treeViewer.getInput() instanceof SingleVariableDeclaration) {
+                value = getValueForMethod(method, (SingleVariableDeclaration) treeViewer
+                        .getInput());
+            }
+        } catch (JavaModelException jme) {
+            JAXWSUIPlugin.log(jme.getStatus());
+        }
+        return value;
+    }
+    
+    private Object getValueForMethod(Method method, IAnnotatable annotatedElement) throws JavaModelException {
+        Class<?> returnType = method.getReturnType();
+        IAnnotation[] annotations = annotatedElement.getAnnotations();
+        for (IAnnotation annotation : annotations) {
+            Class<?> declaringClass = method.getDeclaringClass();
+            String annotationName = annotation.getElementName();
+            if (annotationName.equals(declaringClass.getSimpleName())
+                    || annotationName.equals(declaringClass.getCanonicalName())) {
+                IMemberValuePair[] memberValuePairs = annotation.getMemberValuePairs();
+                for (IMemberValuePair memberValuePair : memberValuePairs) {
+                    if (memberValuePair.getMemberName().equals(method.getName())) {
+                        if (returnType.equals(String.class)) {
+                            return memberValuePair.getValue();
+                        }
+
+                        if (returnType.isEnum()) {
+                            String enumValue = memberValuePair.getValue().toString();
+                            String literal = enumValue.substring(enumValue.lastIndexOf(".") + 1); //$NON-NLS-1$
+                            Object[] enumConstants = method.getReturnType().getEnumConstants();
+                            for (int i = 0; i < enumConstants.length; i++) {
+                                if (enumConstants[i].toString().equals(literal)) {
+                                    return i;
+                                }
+                            }
+                        }
+
+                        if (returnType.equals(Class.class)) {
+                            return memberValuePair.getValue();
+                        }
+                        
+                        if (returnType.equals(Boolean.TYPE)) {
+                            return memberValuePair.getValue();
+                        }
+
+                        if (returnType.isPrimitive()) {
+                            return ""; //$NON-NLS-1$
+                        }
+                        if (returnType.isArray()) {
+                            if (memberValuePair.getValueKind() == IMemberValuePair.K_CLASS) {
+                                Object[] arrayValues = (Object[])memberValuePair.getValue();
+                                for (int i = 0; i < arrayValues.length; i++) {
+                                    String value = arrayValues[i].toString();
+                                    arrayValues[i] = value + ".class";
+                                }
+                                return arrayValues;
+                            }
+                            return memberValuePair.getValue();
+                        }
+                    }
+                }
+                return getDefaultValueForMethod(returnType);
+            }
+        }
+        return null;
+    }
+    
+    @SuppressWarnings("unchecked")
+    private Object getValueForMethod(Method method, SingleVariableDeclaration parameter) {
+        Class<?> returnType = method.getReturnType();
+        List<IExtendedModifier> modifiers = parameter.modifiers();
+        for (IExtendedModifier extendedModifier : modifiers) {
+            if (extendedModifier instanceof NormalAnnotation) {
+                NormalAnnotation normalAnnotation = (NormalAnnotation) extendedModifier;
+                Class<?> declaringClass = method.getDeclaringClass();
+                String annotationName = AnnotationUtils.getAnnotationName(normalAnnotation);
+                if (annotationName.equals(declaringClass.getSimpleName())
+                        || annotationName.equals(declaringClass.getCanonicalName())) {
+                    List<MemberValuePair> memberValuePairs = normalAnnotation.values();
+                    for (MemberValuePair memberValuePair : memberValuePairs) {
+                        if (memberValuePair.getName().toString().equals(method.getName())) {
+                            if (returnType.equals(String.class)) {
+                                StringLiteral stringLiteral = (StringLiteral) memberValuePair
+                                        .getValue();
+                                return stringLiteral.getLiteralValue();
+                            }
+
+                            if (returnType.isEnum()) {
+                                QualifiedName enumValue = (QualifiedName) memberValuePair
+                                        .getValue();
+                                SimpleName literal = enumValue.getName();
+                                Object[] enumConstants = method.getReturnType()
+                                        .getEnumConstants();
+                                for (int i = 0; i < enumConstants.length; i++) {
+                                    if (enumConstants[i].toString().equals(literal)) {
+                                        return i;
+                                    }
+                                }
+                            }
+
+                            if (returnType.equals(Class.class)) {
+                                return memberValuePair.getValue();
+                            }
+
+                            if (returnType.equals(Boolean.TYPE)) {
+                                BooleanLiteral booleanLiteral = (BooleanLiteral) memberValuePair
+                                        .getValue();
+                                return booleanLiteral.booleanValue();
+                            }
+                        }
+                    }
+                    return getDefaultValueForMethod(returnType);
+                }
+            }
+        }
+        return null;
+    }
+    
+    private Object getDefaultValueForMethod(Class<?> returnType) {
+        if (returnType.equals(String.class)) {
+            return ""; //$NON-NLS-1$
+        }
+        if (returnType.equals(Boolean.TYPE)) {
+            return Boolean.FALSE;
+        }
+        if (returnType.isEnum()) {
+            return -1;
+        }
+        if (returnType.isPrimitive()) {
+            return ""; //$NON-NLS-1$
+        }
+        if (returnType.isArray()) {
+            return new Object[] {};
+        }
+        return null;
+    }
+        
+    @Override
+    protected void setValue(Object element, Object value) {
+        if (value == null) {
+            return;
+        }
+        TreePath[] expandedTreePaths = treeViewer.getExpandedTreePaths();
+        try {
+            if (element instanceof Class) {
+                Class<? extends java.lang.annotation.Annotation> annotationClass = 
+                    AnnotationsManager.getAnnotationDefinitionForClass(element).getAnnotationClass();
+                
+                if (annotationClass != null) {
+                    setValueForClass(annotationClass, (Boolean) value);
+                }
+            }
+            if (element instanceof Method) {
+                setValueForMethod((Method) element, value);
+            }
+        } catch (CoreException ce) {
+            JAXWSUIPlugin.log(ce.getStatus());
+        } 
+        treeViewer.setExpandedTreePaths(expandedTreePaths);
+    }
+    
+    private void setValueForClass(Class<? extends java.lang.annotation.Annotation> annotationClass, 
+            Boolean annotate) throws CoreException {
+        Object viewerInput = treeViewer.getInput();
+
+        IAnnotationAttributeInitializer annotationAttributeInitializer = 
+            AnnotationsManager.getAnnotationDefinitionForClass(annotationClass).getAnnotationAttributeInitializer();
+        
+        if (viewerInput instanceof IPackageDeclaration) {
+            setValueForClass(annotationClass, annotate, (IPackageDeclaration) viewerInput, 
+                    annotationAttributeInitializer);
+        } else if (viewerInput instanceof IMember) {
+            setValueForClass(annotationClass, annotate, (IMember) viewerInput, annotationAttributeInitializer);
+        } else if (viewerInput instanceof SingleVariableDeclaration) {
+            setValueForClass(annotationClass, annotate, (SingleVariableDeclaration) viewerInput,
+                    annotationAttributeInitializer);
+        }
+    }
+    
+    private void setValueForClass(Class<? extends java.lang.annotation.Annotation> annotationClass,
+            Boolean annotate, IPackageDeclaration packageDeclaration,
+            IAnnotationAttributeInitializer annotationAttributeInitializer) throws CoreException {
+        
+        ICompilationUnit source = JDTUtils.getCompilationUnitFromFile((IFile)packageDeclaration.getResource());
+        CompilationUnit compilationUnit = JDTUtils.getCompilationUnit(source);
+        
+        PackageDeclaration pkgDeclaration = compilationUnit.getPackage();
+
+        AST ast = pkgDeclaration.getAST();
+        ASTRewrite rewriter = ASTRewrite.create(ast);
+
+
+        List<MemberValuePair> memberValueParis = annotationAttributeInitializer.getMemberValuePairs(
+                pkgDeclaration, ast, annotationClass);
+
+        Annotation annotation = AnnotationsCore.getAnnotation(ast, annotationClass, memberValueParis);
+
+        TextFileChange textFileChange = AnnotationUtils.createTextFileChange("AC", (IFile) source.getResource());
+
+        if (annotate) {
+            AnnotationUtils.createPackageDeclarationAnnotationChange(source, pkgDeclaration, rewriter,
+                    annotation, textFileChange);
+        } else {
+            AnnotationUtils.removeAnnotationFromPackageDeclaration(source, pkgDeclaration, rewriter, 
+                    annotation, textFileChange);
+        }
+
+        AnnotationUtils.getImportChange(compilationUnit, annotationClass, textFileChange, annotate);
+
+        executeChange(new NullProgressMonitor(), textFileChange);
+    }
+
+
+    private void setValueForClass(Class<? extends java.lang.annotation.Annotation> annotationClass,
+            Boolean annotate, IMember member, IAnnotationAttributeInitializer annotationAttributeInitializer) 
+                throws CoreException {
+        ICompilationUnit source = member.getCompilationUnit();
+        CompilationUnit compilationUnit = JDTUtils.getCompilationUnit(source);
+        AST ast = compilationUnit.getAST();
+        ASTRewrite rewriter = ASTRewrite.create(ast);
+
+        List<MemberValuePair> memberValueParis = annotationAttributeInitializer
+                .getMemberValuePairs(member, ast, annotationClass);
+
+        Annotation annotation = AnnotationsCore.getAnnotation(ast, annotationClass,
+                memberValueParis);
+
+        TextFileChange textFileChange = AnnotationUtils.createTextFileChange("AC", (IFile) source.getResource());
+
+        if (annotate) {
+            if (member.getElementType() == IJavaElement.TYPE) {
+                AnnotationUtils.createTypeAnnotationChange(source, compilationUnit, rewriter,
+                        annotation, textFileChange);
+            } else if (member.getElementType() == IJavaElement.METHOD) {
+                AnnotationUtils.createMethodAnnotationChange(source, compilationUnit, rewriter,
+                        (IMethod) member, annotation, textFileChange);
+            } else if (member.getElementType() == IJavaElement.FIELD) {
+                AnnotationUtils.createFiedlAnnotationChange(source, compilationUnit, rewriter,
+                        (IField) member, annotation, textFileChange);
+            }
+        } else {
+            if (member.getElementType() == IJavaElement.PACKAGE_DECLARATION) {
+                
+            }
+            if (member.getElementType() == IJavaElement.TYPE) {
+                AnnotationUtils.removeAnnotationFromType(source, compilationUnit, rewriter,
+                        annotation, textFileChange);
+            } else if (member.getElementType() == IJavaElement.METHOD) {
+                AnnotationUtils.removeAnnotationFromMethod(source, compilationUnit, rewriter,
+                        (IMethod) member, annotation, textFileChange);
+            } else if (member.getElementType() == IJavaElement.FIELD) {
+                AnnotationUtils.removeAnnotationFromField(source, compilationUnit, rewriter,
+                        (IField) member, annotation, textFileChange);
+            }
+        }
+        
+        AnnotationUtils.getImportChange(compilationUnit, annotationClass, textFileChange, annotate);
+
+        executeChange(new NullProgressMonitor(), textFileChange);
+    }
+  
+    private void setValueForClass(Class<? extends java.lang.annotation.Annotation> annotationClass,
+            Boolean annotate, SingleVariableDeclaration parameter, 
+            IAnnotationAttributeInitializer annotationAttributeInitializer) throws CoreException {
+        ITextEditor txtEditor = (ITextEditor) PlatformUI.getWorkbench().getActiveWorkbenchWindow()
+                .getActivePage().getActiveEditor();
+        IFile file = ((IFileEditorInput) txtEditor.getEditorInput()).getFile();
+        ICompilationUnit source = JDTUtils.getCompilationUnitFromFile(file);
+
+        CompilationUnit compilationUnit = JDTUtils.getCompilationUnit(source);
+        AST ast = parameter.getAST();
+        ASTRewrite rewriter = ASTRewrite.create(ast);
+
+        List<MemberValuePair> memberValueParis = annotationAttributeInitializer.getMemberValuePairs(
+                parameter, ast, annotationClass);
+
+        Annotation annotation = AnnotationsCore.getAnnotation(ast, annotationClass, memberValueParis);
+
+        TextFileChange textFileChange = AnnotationUtils.createTextFileChange("AC", (IFile) source.getResource());
+
+        if (annotate) {
+            AnnotationUtils.createMethodParameterAnnotationChange(source, rewriter, parameter, annotation,
+                    textFileChange);
+        } else {
+            AnnotationUtils.removeAnnotationFromMethodParameter(source, rewriter, parameter, annotation,
+                    textFileChange);
+        }
+        AnnotationUtils.getImportChange(compilationUnit, annotationClass, textFileChange, annotate);
+
+        executeChange(new NullProgressMonitor(), textFileChange);
+    }
+    
+    private void setValueForMethod(Method method, Object value) throws CoreException {
+        if (((Boolean) getValue(method.getDeclaringClass())).booleanValue()) {
+            Object viewerInput = treeViewer.getInput();
+            if (viewerInput instanceof IAnnotatable) {
+                setValueForMethod(method, value, (IJavaElement) viewerInput);
+            } else if (treeViewer.getInput() instanceof SingleVariableDeclaration) {
+                setValueForMethod(method, value, (SingleVariableDeclaration) treeViewer.getInput());
+            }
+        }
+    }
+    
+    private ICompilationUnit getCompilationUnitForType(IJavaElement javaElement) throws JavaModelException {
+        int elementType = javaElement.getElementType();
+        if (elementType == IJavaElement.TYPE) {
+            IType type = (IType)javaElement.getPrimaryElement();
+            return type.getCompilationUnit();
+        }
+        if (elementType == IJavaElement.METHOD) {
+            IMethod method = (IMethod)javaElement.getPrimaryElement();
+            return method.getCompilationUnit();
+        }
+        if (elementType == IJavaElement.FIELD) {
+            IField field = (IField)javaElement.getPrimaryElement();
+            return field.getCompilationUnit();
+        }
+        return JDTUtils.getCompilationUnitFromFile((IFile)javaElement.getCorrespondingResource());
+    }
+
+    private void setValueForMethod(Method method, Object value, IJavaElement javaElement) throws CoreException {
+        ICompilationUnit source = getCompilationUnitForType(javaElement);        
+        CompilationUnit compilationUnit = JDTUtils.getCompilationUnit(source);
+        AST ast = compilationUnit.getAST();
+        ASTRewrite rewriter = ASTRewrite.create(ast);
+
+        TextFileChange textFileChange = AnnotationUtils.createTextFileChange("AC", (IFile) source.getResource());
+
+        IAnnotatable annotatedElement = (IAnnotatable) javaElement;
+        IAnnotation[] annotations = annotatedElement.getAnnotations();
+        for (IAnnotation annotation : annotations) {
+            Class<?> declaringClass = method.getDeclaringClass();
+            String annotationName = annotation.getElementName();
+            if (annotationName.equals(declaringClass.getSimpleName())
+                    || annotationName.equals(declaringClass.getCanonicalName())) {
+                IMemberValuePair[] memberValuePairs = annotation.getMemberValuePairs();
+                boolean hasMemberValuePair = false;
+                for (IMemberValuePair memberValuePair : memberValuePairs) {
+                    if (memberValuePair.getMemberName().equals(method.getName())) {
+                        ASTNode memberValue = getMemberValuePairValue(ast, method, value);
+                        if (memberValue != null) {
+                            AnnotationUtils.updateMemberVaulePairValue(source,
+                                    compilationUnit, rewriter, javaElement, annotation,
+                                    memberValuePair, memberValue, textFileChange);
+                            hasMemberValuePair = true;
+                            break;
+                        }
+                    }
+                }
+                if (!hasMemberValuePair) {
+                    ASTNode memberVaulePair = getMemberValuePair(ast, method, value);
+                    if (memberVaulePair != null) {
+                        AnnotationUtils
+                                .createMemberVaulePairChange(source, compilationUnit,
+                                        rewriter, javaElement, annotation, memberVaulePair,
+                                        textFileChange);
+                        break;
+                    }
+                }
+            }
+        }
+        executeChange(new NullProgressMonitor(), textFileChange);
+    }
+    
+    @SuppressWarnings("unchecked")
+    private void setValueForMethod(Method method, Object value, SingleVariableDeclaration parameter) 
+            throws CoreException {
+        ITextEditor txtEditor = (ITextEditor) PlatformUI.getWorkbench().getActiveWorkbenchWindow()
+                .getActivePage().getActiveEditor();
+        IFile file = ((IFileEditorInput) txtEditor.getEditorInput()).getFile();
+        ICompilationUnit source = JDTUtils.getCompilationUnitFromFile(file);
+
+        CompilationUnit compilationUnit = JDTUtils.getCompilationUnit(source);
+        AST ast = parameter.getAST();
+        ASTRewrite rewriter = ASTRewrite.create(ast);
+
+        TextFileChange textFileChange = AnnotationUtils.createTextFileChange("AC", (IFile) source.getResource());
+
+        List<IExtendedModifier> modifiers = parameter.modifiers();
+        for (IExtendedModifier extendedModifier : modifiers) {
+            if (extendedModifier instanceof NormalAnnotation) {
+                NormalAnnotation normalAnnotation = (NormalAnnotation) extendedModifier;
+                String annotationName = AnnotationUtils.getAnnotationName(normalAnnotation);
+                Class<?> declaringClass = method.getDeclaringClass();
+                if (annotationName.equals(declaringClass.getSimpleName())
+                        || annotationName.equals(declaringClass.getCanonicalName())) {
+                    List<MemberValuePair> memberValuePairs = normalAnnotation.values();
+                    boolean hasMemberValuePair = false;
+                    for (MemberValuePair memberValuePair : memberValuePairs) {
+                        if (memberValuePair.getName().toString().equals(method.getName())) {
+                            ASTNode memberValue = getMemberValuePairValue(ast, method, value);
+                            if (memberValue != null) {
+                                AnnotationUtils.updateMemberVaulePairValue(source, compilationUnit, rewriter,
+                                        normalAnnotation, memberValuePair, memberValue, textFileChange);
+                                hasMemberValuePair = true;
+                                break;
+                            }
+                        }
+                    }
+                    if (!hasMemberValuePair) {
+                        ASTNode memberValuePair = getMemberValuePair(ast, method, value);
+                        if (memberValuePair != null) {
+                            AnnotationUtils.createMemberVaulePairChange(source, compilationUnit, rewriter,
+                                    normalAnnotation, memberValuePair, textFileChange);
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+        executeChange(new NullProgressMonitor(), textFileChange);
+    }
+
+    private ASTNode getMemberValuePairValue(AST ast, Method method, Object value) {
+        Class<?> returnType = method.getReturnType();
+        if (returnType.equals(String.class)) {
+            return AnnotationsCore.getStringLiteral(ast, value.toString());
+        }
+        if (returnType.equals(Boolean.TYPE)) {
+            return AnnotationsCore.getBooleanLiteral(ast, ((Boolean) value).booleanValue());
+        }
+        if (returnType.isPrimitive()
+                && (returnType.equals(Byte.TYPE) || returnType.equals(Short.TYPE)
+                        || returnType.equals(Integer.TYPE) || returnType.equals(Long.TYPE)
+                        || returnType.equals(Float.TYPE) || returnType.equals(Double.TYPE))) {
+            return AnnotationsCore.getNumberLiteral(ast, value.toString());
+        }
+        if (returnType.isArray()) {
+            return AnnotationsCore.getArrayValueLiteral(ast, method, (Object[]) value);
+        }
+        
+        if (returnType.equals(Class.class)) {
+            return AnnotationsCore.getTypeLiteral(ast, value.toString());
+        }
+        
+        if (returnType.isEnum()) {
+            int selected = ((Integer) value).intValue();
+            if (selected != -1) {
+                return AnnotationsCore.getEnumLiteral(ast, method.getDeclaringClass().getCanonicalName(),
+                        method.getReturnType().getEnumConstants()[selected]);
+            }
+        }
+        return null;
+    }
+
+    private ASTNode getMemberValuePair(AST ast, Method method, Object value) {
+        Class<?> returnType = method.getReturnType();
+        if (returnType.equals(String.class)) {
+            return AnnotationsCore.getStringMemberValuePair(ast, method.getName(), value);
+        }
+        if (returnType.equals(Boolean.TYPE)) {
+            return AnnotationsCore.getBooleanMemberValuePair(ast, method.getName(), value);
+        }
+        if (returnType.isPrimitive()
+                && (returnType.equals(Byte.TYPE) || returnType.equals(Short.TYPE)
+                        || returnType.equals(Integer.TYPE) || returnType.equals(Long.TYPE)
+                        || returnType.equals(Float.TYPE) || returnType.equals(Double.TYPE))) {
+            return AnnotationsCore.getNumberMemberValuePair(ast, method.getName(), value.toString());
+        }
+        if (returnType.isArray()) {
+            return AnnotationsCore.getArrayMemberValuePair(ast, method, (Object[]) value);
+        }
+        
+        if (returnType.equals(Class.class)) {
+            return AnnotationsCore.getTypeMemberVaulePair(ast, method.getName(), value.toString());
+        }
+
+        if (returnType.isEnum()) {
+            int selected = ((Integer) value).intValue();
+            if (selected != -1) {
+                return AnnotationsCore.getEnumMemberValuePair(ast, 
+                       method.getDeclaringClass().getCanonicalName(), method.getName(), method.getReturnType()
+                        .getEnumConstants()[selected]);
+            }
+        }
+        return null;
+    }
+
+    @SuppressWarnings("restriction")
+    private void executeChange(IProgressMonitor monitor, Change change) {
+        if (change == null) {
+            return;
+        }
+
+        change.initializeValidationData(monitor);
+
+        PerformChangeOperation changeOperation = RefactoringUI.createUIAwareChangeOperation(change);
+
+        WorkbenchRunnableAdapter adapter = new WorkbenchRunnableAdapter(changeOperation);
+        try {
+            PlatformUI.getWorkbench().getProgressService().runInUI(new BusyIndicatorRunnableContext(), adapter,
+                adapter.getSchedulingRule());
+        } catch (InvocationTargetException ite) {
+            JAXWSUIPlugin.log(ite);
+        } catch (InterruptedException ie) {
+            JAXWSUIPlugin.log(ie);
+        }
+            
+        annotationsView.refresh();
+    }
+}
diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsView.java b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsView.java
new file mode 100755
index 0000000..dc2a8a5
--- /dev/null
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsView.java
@@ -0,0 +1,449 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Shane Clarke.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Shane Clarke - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ws.internal.jaxws.ui.views;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IField;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.IPackageDeclaration;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
+import org.eclipse.jdt.ui.JavaUI;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.TreeViewerColumn;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerComparator;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.jst.ws.internal.jaxws.core.annotations.AnnotationDefinition;
+import org.eclipse.jst.ws.internal.jaxws.core.annotations.AnnotationsManager;
+import org.eclipse.jst.ws.internal.jaxws.core.utils.JDTUtils;
+import org.eclipse.jst.ws.internal.jaxws.ui.JAXWSUIMessages;
+import org.eclipse.jst.ws.internal.jaxws.ui.JAXWSUIPlugin;
+import org.eclipse.jst.ws.internal.jaxws.ui.actions.AnnotationsViewFilterAction;
+import org.eclipse.jst.ws.internal.jaxws.ui.widgets.ClasspathComposite;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeColumn;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IEditorDescriptor;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.INullSelectionListener;
+import org.eclipse.ui.IPartListener2;
+import org.eclipse.ui.IViewSite;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchPartReference;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.ui.part.PageBook;
+import org.eclipse.ui.part.ViewPart;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+/**
+ * 
+ * @author sclarke
+ *
+ */
+public class AnnotationsView extends ViewPart implements INullSelectionListener, IPartListener2 {
+    private PageBook pageBook;
+    private Tree annotationTree;
+
+    private Composite notAvaiableComposite;
+    private ClasspathComposite setupClasspathComposite;
+    
+	private TreeViewer annotationTreeViewer;
+	
+	private IMemento memento;
+	
+	private AnnotationsViewFilterAction annotationsViewFilterAction;
+
+	public AnnotationsView() {
+	}
+
+    public void createPartControl(Composite parent) {
+        pageBook = new PageBook(parent, SWT.NONE);
+        
+        annotationTree = new Tree(pageBook, SWT.SINGLE | SWT.FULL_SELECTION | SWT.BORDER | SWT.V_SCROLL
+                | SWT.H_SCROLL);
+        annotationTreeViewer = new TreeViewer(annotationTree);
+		
+		annotationTreeViewer.setContentProvider(new AnnotationsViewContentProvider());
+		annotationTreeViewer.getTree().setHeaderVisible(true);
+		annotationTreeViewer.getTree().setLinesVisible(true);
+		
+		TreeViewerColumn annotationsViewerColumn = new TreeViewerColumn(annotationTreeViewer, SWT.NONE);
+		annotationsViewerColumn.setLabelProvider(new AnnotationsColumnLabelProvider());
+		TreeColumn annotationsColumn = annotationsViewerColumn.getColumn();
+		annotationsColumn.setWidth(400);
+        annotationsColumn.setMoveable(false);
+        annotationsColumn.setText(JAXWSUIMessages.ANNOTATIONS_VIEW_ANNOTATIONS_COLUMN_NAME);
+        
+        TreeViewerColumn valuesViewerColumn = new TreeViewerColumn(annotationTreeViewer, SWT.NONE);
+        valuesViewerColumn.setLabelProvider(new AnnotationsValuesColumnLabelProvider(annotationTreeViewer));
+        valuesViewerColumn.setEditingSupport(new AnnotationsValuesEditingSupport(this, annotationTreeViewer));
+        TreeColumn valuesColumn = valuesViewerColumn.getColumn(); 
+		valuesColumn.setWidth(400);
+		valuesColumn.setMoveable(false);
+		valuesColumn.setAlignment(SWT.LEFT);
+		valuesColumn.setText(JAXWSUIMessages.ANNOTATIONS_VIEW_ANNOTATIONS_VALUES_COLUMN_NAME);
+		
+		//Selection Service
+		startListeningForSelectionChanges();
+		//Part Service
+		getViewSite().getWorkbenchWindow().getPartService().addPartListener(this);
+		
+		contributeToActionBars();
+		
+		notAvaiableComposite = new Composite(pageBook, SWT.NONE);
+		GridLayout gridLayout = new GridLayout();
+		notAvaiableComposite.setLayout(gridLayout);
+		GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
+		notAvaiableComposite.setLayoutData(gridData);
+		notAvaiableComposite.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE));
+		Label label = new Label(notAvaiableComposite, SWT.NONE);
+		label.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE));
+		label.setText(JAXWSUIMessages.ANNOTATIONS_VIEW_ANNOTATIONS_NOT_AVAILABLE_ON_SELECTION);
+		
+		annotationTreeViewer.setComparator(new ViewerComparator() {
+            @Override
+            public int compare(Viewer viewer, Object obj1, Object obj2) {
+                if (obj1 instanceof Class) {
+                  return AnnotationsManager.getAnnotationDefinitionForClass(obj1).getAnnotationClassName().
+                      compareTo(AnnotationsManager.getAnnotationDefinitionForClass(obj2).
+                              getAnnotationClassName());
+                }
+                if (obj1 instanceof Method) {
+                    return ((Method)obj1).getName().compareTo(((Method)obj2).getName());
+                }
+                return super.compare(viewer, obj1, obj2);
+            }
+		});
+		
+		//TODO Add a Faceted Project composite
+		setupClasspathComposite = new ClasspathComposite(pageBook, SWT.NONE);
+
+		pageBook.showPage(notAvaiableComposite);
+	}
+    
+    private void startListeningForSelectionChanges() {
+        getViewSite().getWorkbenchWindow().getSelectionService().addPostSelectionListener(this);
+    }
+    
+    private void stopListeningForSelectionChanges() {
+        getViewSite().getWorkbenchWindow().getSelectionService().removePostSelectionListener(this);
+    }
+    
+    public void selectionChanged(IWorkbenchPart part, ISelection selection) {
+        IWorkbenchPage workbenchPage = getViewSite().getWorkbenchWindow().getActivePage();
+        IWorkbenchPartReference workbenchPartReference = workbenchPage.getActivePartReference();
+       
+        if ( workbenchPartReference.getId().equals(getViewSite().getId()) 
+                || !workbenchPartReference.getId().equals(JavaUI.ID_CU_EDITOR)) {
+            return;
+        }
+
+        IEditorPart editorPart = workbenchPage.getActiveEditor();
+
+        IFileEditorInput fileEditorInput = (IFileEditorInput) editorPart.getEditorInput();
+
+        if (selection instanceof TextSelection) {
+            ITextSelection txtSelection = (TextSelection) selection;
+            ICompilationUnit compilationUnit = JDTUtils.getCompilationUnitFromFile(fileEditorInput.getFile());
+            if (compilationUnit != null) {
+                updateView(compilationUnit, txtSelection);
+            }
+        }
+    }
+
+	public void updateView(IJavaElement javaElement, ITextSelection textSelection) {
+        IJavaProject javaProject = javaElement.getJavaProject();
+
+        if (!checkClasspath(javaProject)) {
+            annotationTreeViewer.setInput(null);
+            pageBook.showPage(setupClasspathComposite);
+            return;
+        }
+
+        pageBook.showPage(annotationTree);
+
+	    int offset = textSelection.getOffset();
+        try {
+            ICompilationUnit compilationUnit = null;
+            if (javaElement instanceof ICompilationUnit) {
+                compilationUnit = (ICompilationUnit)javaElement;
+                javaElement = compilationUnit.getElementAt(offset);
+            }
+        
+            if (javaElement == null) {
+                return;
+            }
+            
+            if (javaElement.getElementType() == IJavaElement.PACKAGE_DECLARATION) {
+                if (javaElement.getResource().getName().equals("package-info.java")) { //$NON-NLS-1$
+                    annotationTreeViewer.setInput((IPackageDeclaration) javaElement);
+                } else {
+                    annotationTreeViewer.setInput(null);
+                }
+            }
+            
+            if (javaElement.getElementType() == IJavaElement.IMPORT_DECLARATION) {
+                annotationTreeViewer.setInput(null);
+            }
+            
+            if (javaElement.getElementType() == IJavaElement.TYPE) {
+                annotationTreeViewer.setInput((IType) javaElement);
+            }
+    
+            if (javaElement.getElementType() == IJavaElement.FIELD) {
+                annotationTreeViewer.setInput((IField) javaElement);
+            }
+
+            if (javaElement.getElementType() == IJavaElement.METHOD) {
+                IMethod method = (IMethod) javaElement;
+                SingleVariableDeclaration parameter = JDTUtils
+                        .getMethodParameter(method, offset);
+                if (parameter != null) {
+                    annotationTreeViewer.setInput(parameter);
+                } else {
+                    annotationTreeViewer.setInput(method);
+                }
+            }
+            annotationTreeViewer.refresh();
+        } catch (JavaModelException jme) {
+            JAXWSUIPlugin.log(jme.getStatus());
+        }
+	}
+    
+    private boolean checkClasspath(IJavaProject javaProject) {
+        List<String> categories = new ArrayList<String>();
+        categories.addAll(AnnotationsManager.getAnnotationCategories());
+        ViewerFilter[] viewerFilters = annotationTreeViewer.getFilters();
+        for (ViewerFilter viewerFilter : viewerFilters) {
+           if (viewerFilter instanceof AnnotationsViewCategoryFilter) {
+               categories.removeAll(((AnnotationsViewCategoryFilter)viewerFilter).getCategories());
+           }
+        }
+
+        boolean jwsReady = true;
+        try {
+            for (String category : categories) {
+                List<AnnotationDefinition> annotationDefinitions = AnnotationsManager
+                        .getAnnotationsByCategory(category);
+                String className = annotationDefinitions.get(0).getAnnotationClassName();
+                if (javaProject.findType(className) == null) {
+                    jwsReady = false;
+                    setupClasspathComposite.updateLibraryLabel(category);
+                    break;
+                } else {
+                    continue;
+                }
+            }
+        } catch (JavaModelException jme) {
+            JAXWSUIPlugin.log(jme.getStatus());
+        }
+        return jwsReady;
+    }
+
+    public void partActivated(IWorkbenchPartReference partRef) {
+        IWorkbenchPart workbenchPart = partRef.getPart(false);
+        if (partRef.getId().equals(JavaUI.ID_CU_EDITOR)) {
+            javaEditorActivated((IEditorPart) workbenchPart);
+        } else if (partRef.getId().equals(getViewSite().getId())) {
+            //annotationsViewActivated();
+        } else {
+            clearAnnotationsView();
+        }
+    }
+
+    public void partDeactivated(IWorkbenchPartReference partRef) {
+    }
+
+    public void partVisible(IWorkbenchPartReference partRef) {
+        if (partRef.getId().equals(getViewSite().getId())) {
+            startListeningForSelectionChanges();
+        }
+    }
+
+    public void partHidden(IWorkbenchPartReference partRef) {
+        if (partRef.getId().equals(getViewSite().getId())) {
+            stopListeningForSelectionChanges();
+        }
+    }
+
+    public void partOpened(IWorkbenchPartReference partRef) {
+    }
+
+    public void partClosed(IWorkbenchPartReference partRef) {
+        if (partRef.getId().equals(JavaUI.ID_CU_EDITOR)) {
+            if (getViewSite() != null) {
+                IWorkbenchWindow workbenchWindow = getViewSite().getWorkbenchWindow();
+                if (workbenchWindow != null) {
+                    IWorkbenchPage workbenchPage = workbenchWindow.getActivePage();
+                    if (workbenchPage != null) {
+                        IEditorPart editorPart = workbenchPage.getActiveEditor();
+                        try {
+                            if (editorPart == null
+                                    || !(editorPart.getEditorInput() instanceof IFileEditorInput)
+                                    || !IDE.getEditorDescriptor(
+                                            ((IFileEditorInput) editorPart.getEditorInput()).getFile()).getId()
+                                            .equals(JavaUI.ID_CU_EDITOR)) {
+                                clearAnnotationsView();
+                            }
+                        } catch (PartInitException pie) {
+                            JAXWSUIPlugin.log(pie.getStatus());
+                        }                 
+                    }
+                }
+            }
+        }
+    }
+
+    public void partBroughtToTop(IWorkbenchPartReference partRef) {
+    }
+
+    public void partInputChanged(IWorkbenchPartReference partRef) {
+    }
+	
+	private void clearAnnotationsView() {
+        annotationTreeViewer.setInput(null);
+        annotationTreeViewer.refresh();
+        pageBook.showPage(notAvaiableComposite);                
+	}
+	
+	private void javaEditorActivated(IEditorPart editorPart) {
+        ITextEditor textEditor = (ITextEditor) editorPart;
+        ISelection selection = textEditor.getSelectionProvider().getSelection();
+        IJavaElement javaElement = (IJavaElement) editorPart.getEditorInput().getAdapter(IJavaElement.class);
+        if (javaElement != null) {
+            pageBook.showPage(annotationTree);
+            updateView(javaElement, (ITextSelection) selection);
+            selectionChanged(editorPart, selection);
+        }
+    }
+
+    private void annotationsViewActivated() {
+        try {
+            IEditorPart editorPart = getViewSite().getPage().getActiveEditor();
+            if (editorPart != null) {
+                IEditorInput editorInput = editorPart.getEditorInput();
+                if (editorInput instanceof IFileEditorInput) {
+                    IFile file = ((IFileEditorInput) editorInput).getFile();
+                    IEditorDescriptor editorDescriptor = IDE.getEditorDescriptor(file);
+                    if (editorDescriptor.getId().equals(JavaUI.ID_CU_EDITOR)) {
+                        javaEditorActivated(editorPart);
+                    }
+                }
+            }
+        } catch (PartInitException pie) {
+            JAXWSUIPlugin.log(pie.getStatus());
+        }
+    }
+	
+    @Override
+    public void dispose() {
+        super.dispose();
+        stopListeningForSelectionChanges();
+        getViewSite().getWorkbenchWindow().getPartService().removePartListener(this);
+    }
+    
+    @Override
+    public void init(IViewSite site, IMemento memento) throws PartInitException {
+        super.init(site, memento);
+        this.memento = memento;
+    }
+
+    @Override
+    public void saveState(IMemento memento) {
+        super.saveState(memento);
+        annotationsViewFilterAction.saveState(memento);
+    }
+
+	private void contributeToActionBars() {
+		IActionBars bars = getViewSite().getActionBars();
+		fillLocalPullDown(bars.getMenuManager());
+	}
+
+	private void fillLocalPullDown(IMenuManager manager) {
+	    annotationsViewFilterAction = new AnnotationsViewFilterAction(this, annotationTreeViewer,
+	            JAXWSUIMessages.ANNOTATIONS_VIEW_FILTER_ACTION_NAME);
+	    if (memento != null) {
+	        annotationsViewFilterAction.init(memento);
+	    }
+	    manager.add(annotationsViewFilterAction);
+	}
+
+	/**
+	 * Passing the focus request to the viewer's control.
+	 */
+	public void setFocus() {
+		annotationTreeViewer.getControl().setFocus();
+	}
+	
+    public void refresh() {
+        Display display = annotationTreeViewer.getControl().getDisplay();
+        if (!display.isDisposed()) {
+            display.asyncExec(new Runnable() {
+                public void run() {
+                    IWorkbenchWindow workbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+                    IWorkbenchPage workbenchPage = workbenchWindow.getActivePage();
+                    IEditorPart editorPart = workbenchPage.getActiveEditor();
+                    try {
+                        if (editorPart != null
+                                && editorPart.getEditorInput() instanceof IFileEditorInput
+                                && IDE.getEditorDescriptor(
+                                        ((IFileEditorInput) editorPart.getEditorInput()).getFile()).getId()
+                                        .equals(JavaUI.ID_CU_EDITOR)) {
+                            ITextEditor txtEditor = (ITextEditor) workbenchPage.getActiveEditor();
+                            IFileEditorInput fileEditorInput = (IFileEditorInput) txtEditor.getEditorInput();
+
+                            ICompilationUnit compilationUnit = JDTUtils
+                                    .getCompilationUnitFromFile(fileEditorInput.getFile());
+                            if (compilationUnit != null) {
+                                if (!compilationUnit.isConsistent()) {
+                                    compilationUnit.makeConsistent(new NullProgressMonitor());
+                                }
+                                updateView(compilationUnit, (ITextSelection) txtEditor.getSelectionProvider()
+                                        .getSelection());
+                            }
+                        }
+                    } catch (JavaModelException jme) {
+                        JAXWSUIPlugin.log(jme.getStatus());
+                    } catch (PartInitException pie) {
+                        JAXWSUIPlugin.log(pie.getStatus());
+                    }
+                }
+            });
+        }
+    }
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsViewCategoryFilter.java b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsViewCategoryFilter.java
new file mode 100644
index 0000000..499584d
--- /dev/null
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsViewCategoryFilter.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Shane Clarke.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Shane Clarke - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ws.internal.jaxws.ui.views;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.jst.ws.internal.jaxws.core.annotations.AnnotationDefinition;
+import org.eclipse.jst.ws.internal.jaxws.core.annotations.AnnotationsManager;
+import org.eclipse.ui.IMemento;
+
+/**
+ * 
+ * @author sclarke
+ *
+ */
+public class AnnotationsViewCategoryFilter extends ViewerFilter {
+    private static final String TAG_CATEGORY = "AnnotationCategoryFilterInfo"; //$NON-NLS-1$
+    private static final String TAG_CATEGORY_NAME = "categoryName"; //$NON-NLS-1$
+
+    private AnnotationsView annotationsView;
+    private final StructuredViewer viewer;
+
+    private List<Object> categories;
+    
+    public AnnotationsViewCategoryFilter(AnnotationsView annotationsView, StructuredViewer viewer) {
+        this.annotationsView = annotationsView;
+        this.viewer = viewer;
+        categories = new ArrayList<Object>();
+    }
+    
+    @Override
+    public boolean select(Viewer viewer, Object parentElement, Object element) {
+        if (element instanceof Class) {
+            AnnotationDefinition annotationDefinition = AnnotationsManager.
+                getAnnotationDefinitionForClass(element);
+            if (annotationDefinition != null) {
+                return !categories.contains(annotationDefinition.getCategory());
+            }
+        }
+        return true;
+    }
+
+    public void filterAnnotations(List<Object> categories) {
+        this.categories = categories;
+        if (categories.size() > 0) {
+            viewer.addFilter(this);
+        } else {
+            viewer.removeFilter(this);
+        }
+        annotationsView.refresh();
+    }
+    
+    public List<Object> getCategories() {
+        return categories;
+    }
+    
+    public void init(IMemento memento) {
+        IMemento catMemento = memento.getChild(TAG_CATEGORY);
+        if (catMemento == null) {
+            return;
+        }
+        for (int i = 0; i < AnnotationsManager.getAnnotationCategories().size(); i++) {
+            String category = catMemento.getString(TAG_CATEGORY_NAME + i);
+            if (category != null) {
+                categories.add(category);
+            }
+        }
+        filterAnnotations(categories);
+    }
+    
+    public void saveState(IMemento memento) {
+        if (categories == null || categories.size() == 0) {
+            return;
+        }
+        IMemento catMemento = memento.createChild(TAG_CATEGORY);
+        int i = 0;
+        for (Object category : categories) {
+            catMemento.putString(TAG_CATEGORY_NAME + i, category.toString());
+            i++;
+        }
+    }    
+}
diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsViewContentProvider.java b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsViewContentProvider.java
new file mode 100755
index 0000000..805cd01
--- /dev/null
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/AnnotationsViewContentProvider.java
@@ -0,0 +1,53 @@
+/*******************************************************************************

+ * Copyright (c) 2009 Shane Clarke.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *    Shane Clarke - initial API and implementation

+ *******************************************************************************/

+package org.eclipse.jst.ws.internal.jaxws.ui.views;

+

+import org.eclipse.jface.viewers.ITreeContentProvider;

+import org.eclipse.jface.viewers.Viewer;

+import org.eclipse.jst.ws.internal.jaxws.core.annotations.AnnotationsManager;

+

+/**

+ * 

+ * @author sclarke

+ *

+ */

+public class AnnotationsViewContentProvider implements ITreeContentProvider {

+

+	public Object[] getChildren(Object parentElement) {

+	    if (parentElement instanceof Class) {

+	        return ((Class<?>)parentElement).getDeclaredMethods();

+	    }

+		return new Object[] {};

+	}

+

+	public Object getParent(Object element) {

+		return null;

+	}

+

+	public boolean hasChildren(Object element) {

+	    if (element instanceof Class) {

+	        return ((Class<?>)element).getDeclaredMethods().length > 0;

+	    }

+		return false;

+	}

+

+	public Object[] getElements(Object inputElement) {

+	    return AnnotationsManager.getAnnotations(inputElement);

+	}

+	

+	public void dispose() {

+

+	}

+

+	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {

+	}

+

+}

diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/ClassDialogCellEditor.java b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/ClassDialogCellEditor.java
new file mode 100644
index 0000000..224340f
--- /dev/null
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/views/ClassDialogCellEditor.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Shane Clarke.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Shane Clarke - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ws.internal.jaxws.ui.views;
+
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.search.SearchEngine;
+import org.eclipse.jdt.ui.IJavaElementSearchConstants;
+import org.eclipse.jdt.ui.JavaUI;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.viewers.DialogCellEditor;
+import org.eclipse.jst.ws.internal.jaxws.ui.JAXWSUIPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.SelectionDialog;
+
+/**
+ * 
+ * @author sclarke
+ *
+ */
+public class ClassDialogCellEditor extends DialogCellEditor {
+
+    public ClassDialogCellEditor(Composite parent) {
+        super(parent, SWT.NONE);
+    }
+    
+    @Override
+    protected Object openDialogBox(Control cellEditorWindow) {
+        try {
+            SelectionDialog dialog = JavaUI.createTypeDialog(cellEditorWindow.getShell(), 
+                    PlatformUI.getWorkbench().getProgressService(), 
+                    SearchEngine.createWorkspaceScope(), IJavaElementSearchConstants.CONSIDER_CLASSES, 
+                    false, "* "); //$NON-NLS-1$
+            
+            if (dialog.open() == IDialogConstants.OK_ID) {
+                Object[] types = dialog.getResult();
+                
+                if (types != null && types.length > 0) {
+                    IType type = (IType)types[0];
+                    if (type.isBinary()) {
+                        return type.getFullyQualifiedName();
+                    }
+                }
+            }
+        } catch (JavaModelException jme) {
+            JAXWSUIPlugin.log(jme.getStatus());
+        }
+        return null;
+    }
+    
+    @Override
+    protected void updateContents(Object value) {
+        if (value != null) {
+            getDefaultLabel().setText(value.toString() + ".class"); 
+        }
+    }
+}
diff --git a/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/widgets/ClasspathComposite.java b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/widgets/ClasspathComposite.java
new file mode 100644
index 0000000..b454eb4
--- /dev/null
+++ b/bundles/org.eclipse.jst.ws.jaxws.ui/src/org/eclipse/jst/ws/internal/jaxws/ui/widgets/ClasspathComposite.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Shane Clarke.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Shane Clarke - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jst.ws.internal.jaxws.ui.widgets;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.launching.JavaRuntime;
+import org.eclipse.jst.ws.internal.jaxws.ui.JAXWSUIMessages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.PreferencesUtil;
+import org.eclipse.ui.part.FileEditorInput;
+
+/**
+ * 
+ * @author sclarke
+ *
+ */
+public class ClasspathComposite extends Composite {
+    
+    private String JRE_PREF_PAGE_ID = "org.eclipse.jdt.debug.ui.preferences.VMPreferencePage"; //$NON-NLS-1$
+    private String PROP_ID = "org.eclipse.jdt.ui.propertyPages.BuildPathsPropertyPage"; //$NON-NLS-1$
+    private Object DATA_REVEAL_ENTRY = "select_classpath_entry"; //$NON-NLS-1$
+
+    private Label informationLabel;
+    
+    public ClasspathComposite(Composite parent, int style) {
+        super(parent, style);
+        addControls();
+    }
+    
+    public void addControls() {
+        GridLayout gridLayout = new GridLayout();
+        this.setLayout(gridLayout);
+        GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
+        this.setLayoutData(gridData);
+        this.setBackground(getParent().getDisplay().getSystemColor(SWT.COLOR_WHITE));
+        informationLabel = new Label(this, SWT.NONE);
+        informationLabel.setBackground(getParent().getDisplay().getSystemColor(SWT.COLOR_WHITE));
+        informationLabel.setText(JAXWSUIMessages.bind(
+                JAXWSUIMessages.ANNOTATIONS_VIEW_NO_SUITABLE_LIBRARY_FOUND, "JAX-WS"));
+        Link link = new Link(this, SWT.NONE);
+        link.setBackground(getParent().getDisplay().getSystemColor(SWT.COLOR_WHITE));
+        link.setText(JAXWSUIMessages.CONFIGURE_JAVA_1_6_LIBRARY);
+        link.addSelectionListener(new SelectionAdapter() {
+            public void widgetSelected(SelectionEvent selectionEvent) {
+                if (selectionEvent.text.equals("1")) { //$NON-NLS-1$
+                    PreferencesUtil.createPreferenceDialogOn(getShell(), JRE_PREF_PAGE_ID,
+                            new String[] { JRE_PREF_PAGE_ID }, null).open();
+                } else {
+                    Map<Object, IClasspathEntry> data = new HashMap<Object, IClasspathEntry>();
+                    data.put(DATA_REVEAL_ENTRY, JavaRuntime.getDefaultJREContainerEntry());
+                    PreferencesUtil.createPropertyDialogOn(getShell(), getProject(), PROP_ID,
+                            new String[] { PROP_ID }, data).open();
+                }
+            }
+        });
+        //TODO update the labels to provide information for supported annotation libraries that are missing
+        //on the selected projects classpath.
+        //Label otherLibrariesLabel  = new Label(this, SWT.SHADOW_IN);
+        //otherLibrariesLabel.setBackground(getParent().getDisplay().getSystemColor(SWT.COLOR_WHITE));
+        //otherLibrariesLabel.setText("Annotation Libraries currently supported: " + AnnotationsManager.getAnnotationCategories());
+        //otherLibrariesLabel.setText(JAXWSUIMessages.ANNOTATIONS_VIEW_OTHER_ANNOTATION_LIBRARIES_USE);
+
+    }
+
+    private IProject getProject() {
+        return ((FileEditorInput) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
+                .getActiveEditor().getEditorInput()).getFile().getProject();
+    }
+    
+    
+    public void updateLibraryLabel(String libraryName) {
+        informationLabel.setText(JAXWSUIMessages.bind(
+                JAXWSUIMessages.ANNOTATIONS_VIEW_NO_SUITABLE_LIBRARY_FOUND, libraryName));
+    }
+    
+ }