[258649]  ServersView2: When switching modes the server state doesn't update
diff --git a/plugins/org.eclipse.wst.server.ui/plugin.xml b/plugins/org.eclipse.wst.server.ui/plugin.xml
index 0a67a19..1127a86 100644
--- a/plugins/org.eclipse.wst.server.ui/plugin.xml
+++ b/plugins/org.eclipse.wst.server.ui/plugin.xml
@@ -44,7 +44,8 @@
         class="org.eclipse.wst.server.ui.internal.cnf.ServersView2"
         icon="icons/cview16/servers_view.gif"
         id="org.eclipse.wst.server.ui.ServersView"
-        name="%viewServers"/>
+        name="%viewServers">
+  </view>
 </extension>
 <extension
       point="org.eclipse.ui.navigator.navigatorContent">
@@ -89,6 +90,13 @@
          </contentExtension>
       </includes>
    </viewerContentBinding>
+	<viewer viewerId="org.eclipse.wst.server.ui.ServersView">
+		<options>
+			<property name="org.eclipse.ui.navigator.hideLinkWithEditorAction"
+				value="true">
+			</property>
+		</options>
+	</viewer>
 </extension>
 
 <extension point="org.eclipse.ui.perspectiveExtensions">
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/cnf/ServerContentProvider.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/cnf/ServerContentProvider.java
index 4f7e162..5f463e8 100644
--- a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/cnf/ServerContentProvider.java
+++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/cnf/ServerContentProvider.java
@@ -12,46 +12,23 @@
 
 import java.util.*;
 
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.viewers.*;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.wst.server.core.*;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.wst.server.core.IModule;
+import org.eclipse.wst.server.core.IServer;
+import org.eclipse.wst.server.core.ServerCore;
 import org.eclipse.wst.server.core.internal.Server;
-import org.eclipse.wst.server.core.internal.UpdateServerJob;
-import org.eclipse.wst.server.core.util.PublishAdapter;
-import org.eclipse.wst.server.ui.internal.Messages;
-import org.eclipse.wst.server.ui.internal.Trace;
 import org.eclipse.wst.server.ui.internal.view.servers.ModuleServer;
 import org.eclipse.wst.server.ui.internal.viewers.BaseContentProvider;
 
-public class ServerContentProvider extends BaseContentProvider implements ITreeContentProvider {
+public class ServerContentProvider extends BaseContentProvider implements ITreeContentProvider{
+	// TODO Angel Says: Need to review if this is needed
 	public static Object INITIALIZING = new Object();
-	protected IServerLifecycleListener serverResourceListener;
-	protected IPublishListener publishListener;
-	protected IServerListener serverListener;
 
+	// TODO Angel Says: Need to review how to port this function into CNF
 	// servers that are currently publishing and starting
 	protected static Set<String> publishing = new HashSet<String>(4);
-	protected static Set<String> starting = new HashSet<String>(4);
-	protected boolean animationActive = false;
-	protected boolean stopAnimation = false;
-	protected boolean initialized = false;
 		
-	protected StructuredViewer viewer;
-	
-	public ServerContentProvider() {
-		addListeners();
-	}
-	
 	public Object[] getElements(Object element) {
-		if( !initialized ) {
-			deferInitialization();
-			return new Object[] {INITIALIZING};
-		}
-		
 		List<IServer> list = new ArrayList<IServer>();
 		IServer[] servers = ServerCore.getServers();
 		if (servers != null) {
@@ -112,10 +89,8 @@
 				IModule[] curChildModule = curServer.getChildModules(curModule, null);
 				if (curChildModule != null && curChildModule.length > 0)
 					return true;
-				
 				return false;
 			}
-			
 			return false;
 		}
 		if( element instanceof IServer ) {
@@ -123,225 +98,4 @@
 		}
 		return false;
 	}
-	
-	public void inputChanged(Viewer aViewer, Object oldInput, Object newInput) {
-		viewer = (StructuredViewer) aViewer;
-	}
-
-	public void dispose() {
-		ServerCore.removeServerLifecycleListener(serverResourceListener);
-		
-		// remove listeners from servers
-		IServer[] servers = ServerCore.getServers();
-		if (servers != null) {
-			int size = servers.length;
-			for (int i = 0; i < size; i++) {
-				servers[i].removeServerListener(serverListener);
-				((Server) servers[i]).removePublishListener(publishListener);
-			}
-		}
-	}
-	
-	// Listeners and refreshing the viewer
-	protected void addListeners() {
-		serverResourceListener = new IServerLifecycleListener() {
-			public void serverAdded(IServer server) {
-				refreshServer(null);
-				server.addServerListener(serverListener);
-				((Server) server).addPublishListener(publishListener);
-			}
-			public void serverChanged(IServer server) {
-				refreshServer(server);
-			}
-			public void serverRemoved(IServer server) {
-				refreshServer(null);
-				server.removeServerListener(serverListener);
-				((Server) server).removePublishListener(publishListener);
-			}
-		};
-		ServerCore.addServerLifecycleListener(serverResourceListener);
-		
-		publishListener = new PublishAdapter() {
-			public void publishStarted(IServer server) {
-				handlePublishChange(server, true);
-			}
-			
-			public void publishFinished(IServer server, IStatus status) {
-				handlePublishChange(server, false);
-			}
-		};
-		
-		serverListener = new IServerListener() {
-			public void serverChanged(ServerEvent event) {
-				if (event == null)
-					return;
-				
-				int eventKind = event.getKind();
-				IServer server = event.getServer();
-				if ((eventKind & ServerEvent.SERVER_CHANGE) != 0) {
-					// server change event
-					if ((eventKind & ServerEvent.STATE_CHANGE) != 0) {
-						refreshServer(server, true);
-						int state = event.getState();
-						String id = server.getId();
-						animate(id, state);
-					} else
-						refreshServer(server);
-				} else if ((eventKind & ServerEvent.MODULE_CHANGE) != 0) {
-					// module change event
-					if ((eventKind & ServerEvent.STATE_CHANGE) != 0 || (eventKind & ServerEvent.PUBLISH_STATE_CHANGE) != 0) {
-						refreshServer(server);
-					}
-				}
-			}
-		};
-		
-		// add listeners to servers
-		IServer[] servers = ServerCore.getServers();
-		if (servers != null) {
-			int size = servers.length;
-			for (int i = 0; i < size; i++) {
-				servers[i].addServerListener(serverListener);
-				((Server) servers[i]).addPublishListener(publishListener);
-			}
-		}
-	}
-
-	protected void animate(String serverId, int state){
-		if (state == IServer.STATE_STARTING || state == IServer.STATE_STOPPING) {
-			boolean startThread = false;
-			synchronized (starting) {
-				if (!starting.contains(serverId)) {
-					if (starting.isEmpty())
-						startThread = true;
-					starting.add(serverId);
-				}
-			}
-			if (startThread){
-				startThread();
-			}
-		} else {
-			boolean stopThread = false;
-			synchronized (starting) {
-				if (starting.contains(serverId)) {
-					starting.remove(serverId);
-					if (starting.isEmpty())
-						stopThread = true;
-				}
-			}
-			if (stopThread)
-				stopThread();
-		}
-	}
-	
-	protected void deferInitialization() {
-		Job job = new Job(Messages.jobInitializingServersView) {
-			public IStatus run(IProgressMonitor monitor) {
-				IServer[] servers = ServerCore.getServers();
-				int size = servers.length;
-				for (int i = 0; i < size; i++) {
-					((Server)servers[i]).getAllModules().iterator();
-				}
-				
-				for (int i = 0; i < size; i++) {
-					IServer server = servers[i];
-					if (server.getServerType() != null && server.getServerState() == IServer.STATE_UNKNOWN) {
-						UpdateServerJob job2 = new UpdateServerJob(server);
-						job2.schedule();
-					}
-				}
-				initialized = true;
-				refreshServer(null);
-				return Status.OK_STATUS;
-			}
-		};
-		
-		job.setSystem(true);
-		job.setPriority(Job.SHORT);
-		job.schedule();
-	}
-	
-	protected void refreshServer(final IServer server) {
-		refreshServer(server, false);
-	}
-	
-	protected void refreshServer(final IServer server, final boolean resetSelection) {
-		Display.getDefault().asyncExec(new Runnable() {
-			public void run() {
-				try {
-					if( viewer != null && !viewer.getControl().isDisposed()) {
-						// This will trigger some animation
-						viewer.refresh(server);
-						if( resetSelection ) {
-							ISelection sel = viewer.getSelection();
-							viewer.setSelection(sel);
-						}
-						//TODO: Angel says: This doesn't seem to be needed: ServerDecorator.getDefault().redecorate(server);
-					}
-				} catch (Exception e) {
-					// ignore
-				}
-			}
-		});
-	}
-	
-	protected void handlePublishChange(IServer server, boolean isPublishing) {
-		String serverId = server.getId();
-		if (isPublishing)
-			publishing.add(serverId);
-		else
-			publishing.remove(serverId);
-	
-		refreshServer(server);
-	}
-
-	
-	/**
-	 * Start the animation thread
-	 */
-	protected void startThread() {
-		if (animationActive)
-			return;
-		
-		stopAnimation = false;
-		
-		final Display display = viewer == null ? Display.getDefault() : viewer.getControl().getDisplay();
-		final int SLEEP = 200;
-		final Runnable[] animator = new Runnable[1];
-		animator[0] = new Runnable() {
-			public void run() {
-				if (!stopAnimation) {
-					try {
-						int size = 0;
-						String[] servers;
-						synchronized (starting) {
-							size = starting.size();
-							servers = new String[size];
-							starting.toArray(servers);
-							
-						}
-						
-						for (int i = 0; i < size; i++) {
-							IServer server = ServerCore.findServer(servers[i]);
-							if (server != null ) {
-								ServerDecorator.animate();
-								viewer.update(server, new String[]{"ICON"});
-							}
-						}
-					} catch (Exception e) {
-						Trace.trace(Trace.FINEST, "Error in Servers view animation", e);
-					}
-					display.timerExec(SLEEP, animator[0]);
-				}
-			}
-		};
-		Display.getDefault().asyncExec(new Runnable() {
-			public void run() {
-				display.timerExec(SLEEP, animator[0]);
-			}
-		});
-	}
-
-	protected void stopThread() {
-		stopAnimation = true;
-	}}
+}
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/cnf/ServerLabelProvider.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/cnf/ServerLabelProvider.java
index a7f17a3..b0a69be 100644
--- a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/cnf/ServerLabelProvider.java
+++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/cnf/ServerLabelProvider.java
@@ -29,6 +29,7 @@
 	 */
 	public ServerLabelProvider() {
 		super();
+		//TODO: Angel says: Look at bug# 258184
 	}
 
 	public String getText(Object element) {
@@ -62,7 +63,7 @@
 			IServer server = (IServer) element;
 			if (server.getServerType() != null) {
 				image = ImageResource.getImage(server.getServerType().getId());
-				// TODO Angel says: Need to discuss about it
+				// TODO Angel says: Need to fix this
 				// Because we are now grabbing the ServerState the type will not show. It might be best to create a new icon for the state
 				ImageDescriptor imgDescriptor = ServerDecorator.getServerStateImage(server);
 				if (image != null && imgDescriptor != null){
diff --git a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/cnf/ServersView2.java b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/cnf/ServersView2.java
index 1160d99..112fed8 100644
--- a/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/cnf/ServersView2.java
+++ b/plugins/org.eclipse.wst.server.ui/serverui/org/eclipse/wst/server/ui/internal/cnf/ServersView2.java
@@ -22,7 +22,6 @@
 import org.eclipse.jface.action.*;
 import org.eclipse.jface.bindings.TriggerSequence;
 import org.eclipse.jface.viewers.*;
-import org.eclipse.swt.SWT;
 import org.eclipse.swt.dnd.Clipboard;
 import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.widgets.*;
@@ -53,6 +52,7 @@
 		// dummy action
 	};
 	
+	protected IServerLifecycleListener serverResourceListener;
 	protected IPublishListener publishListener;
 	protected IServerListener serverListener;
 		
@@ -79,16 +79,13 @@
 	@Override
 	public void createPartControl(Composite parent) {
 		clipboard = new Clipboard(Display.getCurrent());
-		
 		super.createPartControl(parent);
-		
 		deferInitialization();
 	}
 
 	private void deferInitialization() {
-		TreeItem item = new TreeItem(getCommonViewer().getTree(), SWT.NONE);
-		item.setText(Messages.viewInitializing);
-			
+		// TODO Angel Says: Need to do a final check on this line below. I don't think there is anything else
+		// that we need from to port from the old Servers View
 		//initializeActions(getCommonViewer());
 		
 		Job job = new Job(Messages.jobInitializingServersView) {
@@ -119,8 +116,6 @@
 	}
 	
 	protected void deferredInitialize() {
-		// TODO Angel says: What to do here? 
-		//tableViewer.initialize();
 		addListener();
 		
 		// TODO Angel says: is this the best place for this? 
@@ -184,15 +179,64 @@
 		else
 			publishing.remove(serverId);
 	
-		refreshServer(server);
+		refreshServerState(server);
 	}
 	
-	protected void refreshServer(IServer server){
-		tableViewer.refresh(server);
+	/**
+	 * @deprecated
+	 * @param server
+	 */
+	protected void refreshServer(final IServer server){
+		Trace.trace(Trace.FINEST, "Refreshing UI for server="+server);
+		Display.getDefault().asyncExec(new Runnable() {
+			public void run() {		
+				IDecoratorManager dm = PlatformUI.getWorkbench().getDecoratorManager();
+				dm.update("org.eclipse.wst.server.ui.navigatorDecorator");
+				tableViewer.setSelection(tableViewer.getSelection());
+			}
+		});
+	}
+	
+	protected void refreshServerContent(final IServer server){
+		Trace.trace(Trace.FINEST, "Refreshing Content for server="+server);
+		Display.getDefault().asyncExec(new Runnable() {
+			public void run() {		
+				tableViewer.refresh(server, true);
+			}
+		});
+	}
+	
+	protected void refreshServerState(final IServer server){
+		Trace.trace(Trace.FINEST, "Refreshing UI for server="+server);
+		Display.getDefault().asyncExec(new Runnable() {
+			public void run() {		
+				IDecoratorManager dm = PlatformUI.getWorkbench().getDecoratorManager();
+				dm.update("org.eclipse.wst.server.ui.navigatorDecorator");
+				tableViewer.setSelection(tableViewer.getSelection());
+			}
+		});
 	}
 	
 	protected void addListener(){
+		// To enable the UI updating of servers and its childrens  
+		serverResourceListener = new IServerLifecycleListener() {
+			public void serverAdded(IServer server) {
+				addServer(server);
+				server.addServerListener(serverListener);
+				((Server) server).addPublishListener(publishListener);
+			}
+			public void serverChanged(IServer server) {
+				refreshServerContent(server);
+			}
+			public void serverRemoved(IServer server) {
+				removeServer(server);
+				server.removeServerListener(serverListener);
+				((Server) server).removePublishListener(publishListener);
+			}
+		};
+		ServerCore.addServerLifecycleListener(serverResourceListener);
 		
+		// To enable the refresh of the State decorator
 		publishListener = new PublishAdapter() {
 			public void publishStarted(IServer server) {
 				handlePublishChange(server, true);
@@ -207,13 +251,12 @@
 			public void serverChanged(ServerEvent event) {
 				if (event == null)
 					return;
-				
+								
 				int eventKind = event.getKind();
 				IServer server = event.getServer();
 				if ((eventKind & ServerEvent.SERVER_CHANGE) != 0) {
 					// server change event
 					if ((eventKind & ServerEvent.STATE_CHANGE) != 0) {
-						refreshServer(server);
 						int state = event.getState();
 						String id = server.getId();
 						if (state == IServer.STATE_STARTING || state == IServer.STATE_STOPPING) {
@@ -239,14 +282,16 @@
 							if (stopThread)
 								stopThread();
 						}
-					} else
-						refreshServer(server);
+						refreshServerState(server);
+					} 
 				} else if ((eventKind & ServerEvent.MODULE_CHANGE) != 0) {
 					// module change event
 					if ((eventKind & ServerEvent.STATE_CHANGE) != 0 || (eventKind & ServerEvent.PUBLISH_STATE_CHANGE) != 0) {
-						refreshServer(server);
+						refreshServerContent(server);
 					}
 				}
+				// TODO Angel Says: I don't think we need this
+				//refreshServer(server);
 			}
 		};
 		
@@ -440,7 +485,6 @@
 			cm.add(actions[i]);
 		
 		cm.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-		
 		return super.createCommonActionGroup();
 	}
 
@@ -458,6 +502,38 @@
 		}
 	}
 	
+	protected void addServer(final IServer server) {
+		Display.getDefault().asyncExec(new Runnable() {
+			public void run() {
+				tableViewer.add(tableViewer.getInput(), server);
+			}
+		});
+	}
+
+	protected void removeServer(final IServer server) {
+		Display.getDefault().asyncExec(new Runnable() {
+			public void run() {
+				tableViewer.remove(server);
+			}
+		});
+	}
+	
+	@Override
+	public void dispose() {
+		ServerCore.removeServerLifecycleListener(serverResourceListener);
+
+		// remove listeners from servers
+		IServer[] servers = ServerCore.getServers();
+		if (servers != null) {
+			int size = servers.length;
+			for (int i = 0; i < size; i++) {
+				servers[i].removeServerListener(serverListener);
+				((Server) servers[i]).removePublishListener(publishListener);
+			}
+		}
+		super.dispose();
+	}
+	
 	/**
 	 * Start the animation thread
 	 */