[218281] [hotbug] XSD editor should not redraw tree if visual editor is not active
diff --git a/bundles/org.eclipse.wst.xsd.ui/src-adt/org/eclipse/wst/xsd/ui/internal/adt/design/editparts/BaseEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src-adt/org/eclipse/wst/xsd/ui/internal/adt/design/editparts/BaseEditPart.java
index e6b34b4..29c580e 100644
--- a/bundles/org.eclipse.wst.xsd.ui/src-adt/org/eclipse/wst/xsd/ui/internal/adt/design/editparts/BaseEditPart.java
+++ b/bundles/org.eclipse.wst.xsd.ui/src-adt/org/eclipse/wst/xsd/ui/internal/adt/design/editparts/BaseEditPart.java
@@ -17,6 +17,7 @@
 import org.eclipse.draw2d.geometry.Rectangle;
 import org.eclipse.gef.EditPart;
 import org.eclipse.gef.EditPartFactory;
+import org.eclipse.gef.GraphicalViewer;
 import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
 import org.eclipse.gef.editparts.ScalableRootEditPart;
 import org.eclipse.gef.editparts.ZoomListener;
@@ -35,6 +36,7 @@
 import org.eclipse.wst.xsd.ui.internal.adt.design.editparts.model.IFeedbackHandler;
 import org.eclipse.wst.xsd.ui.internal.adt.design.editpolicies.KeyBoardAccessibilityEditPolicy;
 import org.eclipse.wst.xsd.ui.internal.adt.design.figures.IFigureFactory;
+import org.eclipse.wst.xsd.ui.internal.adt.editor.CommonMultiPageEditor;
 import org.eclipse.wst.xsd.ui.internal.adt.facade.IADTObject;
 import org.eclipse.wst.xsd.ui.internal.adt.facade.IADTObjectListener;
 
@@ -111,20 +113,23 @@
   }
   
   public void refresh() {
-    super.refresh();
-
-    for(Iterator i = getChildren().iterator(); i.hasNext(); )
+    
+    boolean doUpdateDesign = doUpdateDesign();
+    if (doUpdateDesign)
     {
-      Object obj = i.next();
-      if (obj instanceof BaseEditPart)
+      super.refresh();
+      for (Iterator i = getChildren().iterator(); i.hasNext();)
       {
-        ((BaseEditPart)obj).refresh();
+        Object obj = i.next();
+        if (obj instanceof BaseEditPart)
+        {
+          ((BaseEditPart) obj).refresh();
+        }
+        else if (obj instanceof AbstractGraphicalEditPart)
+        {
+          ((AbstractGraphicalEditPart) obj).refresh();
+        }
       }
-      else if (obj instanceof AbstractGraphicalEditPart)
-      {
-        ((AbstractGraphicalEditPart)obj).refresh();
-      }
-      
     }
   }
 
@@ -230,4 +235,37 @@
     }
     return false;
   }
+  
+  // For https://bugs.eclipse.org/bugs/show_bug.cgi?id=218281
+  // Don't want to refresh the design when changes are made in the source view.
+  protected boolean doUpdateDesign()
+  {
+    IWorkbench workbench = PlatformUI.getWorkbench();
+    if (workbench != null)
+    {
+      IWorkbenchWindow workbenchWindow = workbench.getActiveWorkbenchWindow();
+      if (workbenchWindow != null)
+      {
+        IWorkbenchPage page = workbenchWindow.getActivePage();
+        if (page != null)
+        {
+          IEditorPart editorPart = page.getActiveEditor();
+          if (editorPart instanceof CommonMultiPageEditor)
+          {
+            CommonMultiPageEditor editor = (CommonMultiPageEditor) editorPart;
+            GraphicalViewer viewer = (GraphicalViewer)editor.getAdapter(GraphicalViewer.class);
+            // Need to ensure this is the same editor we are working with since the active editor may not be 
+            // the current, eg. at startup, there can be another XSD Editor open on the source page, so we could end
+            // up not populating the design view initally
+            if (getViewer() == viewer)
+            {
+              // If source page is active, don't update the design
+              return !editor.isSourcePageActive();
+            }
+          }
+        }
+      }
+    }
+    return true;
+  }
 }
diff --git a/bundles/org.eclipse.wst.xsd.ui/src-adt/org/eclipse/wst/xsd/ui/internal/adt/editor/ADTMultiPageEditor.java b/bundles/org.eclipse.wst.xsd.ui/src-adt/org/eclipse/wst/xsd/ui/internal/adt/editor/ADTMultiPageEditor.java
index 7942ed1..2473545 100644
--- a/bundles/org.eclipse.wst.xsd.ui/src-adt/org/eclipse/wst/xsd/ui/internal/adt/editor/ADTMultiPageEditor.java
+++ b/bundles/org.eclipse.wst.xsd.ui/src-adt/org/eclipse/wst/xsd/ui/internal/adt/editor/ADTMultiPageEditor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2007 IBM Corporation and others.
+ * Copyright (c) 2001, 2008 IBM Corporation and others.
  * 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
@@ -22,10 +22,12 @@
 import org.eclipse.gef.editparts.ZoomManager;
 import org.eclipse.gef.ui.actions.ActionRegistry;
 import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer;
+import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.ITreeContentProvider;
 import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.StackLayout;
 import org.eclipse.swt.graphics.Rectangle;
@@ -209,6 +211,32 @@
   {
     currentPage = newPageIndex;
     super.pageChange(newPageIndex);
+    
+    if (newPageIndex == DESIGN_PAGE_INDEX)
+    {
+      ISelection selection = graphicalViewer.getSelectionManager().getSelection();
+      Object model = null;
+      if (selection instanceof StructuredSelection)
+      {
+        StructuredSelection structuredSelection = (StructuredSelection)selection;
+        // While in the source view, selection could have changed.
+        // Will try to select the first item when switching back to the design view.
+        // We currently do not multi-select figures if multiple elements are selected in the source view.
+        // For example, if multiple global elements are selected, the graph view will be in the details view
+        // of the first one.
+        Object elem = structuredSelection.getFirstElement();
+        if (elem instanceof EditPart)
+          model = ((EditPart)elem).getModel();
+      }
+      // Refresh the design page upon page change
+      graphicalViewer.getContents().refresh();
+      // Need to use the adapter, since after refresh, the old edit part will have been replaced
+      // Maintain previous selection:
+      if (model != null)
+      {
+        getSelectionManager().setSelection(new StructuredSelection(model));
+      }
+    }
     setFocus();
   }
   
diff --git a/bundles/org.eclipse.wst.xsd.ui/src-adt/org/eclipse/wst/xsd/ui/internal/adt/editor/CommonMultiPageEditor.java b/bundles/org.eclipse.wst.xsd.ui/src-adt/org/eclipse/wst/xsd/ui/internal/adt/editor/CommonMultiPageEditor.java
index 7499b3d..bbcdbbb 100644
--- a/bundles/org.eclipse.wst.xsd.ui/src-adt/org/eclipse/wst/xsd/ui/internal/adt/editor/CommonMultiPageEditor.java
+++ b/bundles/org.eclipse.wst.xsd.ui/src-adt/org/eclipse/wst/xsd/ui/internal/adt/editor/CommonMultiPageEditor.java
@@ -923,5 +923,9 @@
       // do nothing
     }
   }
-
+  
+  public boolean isSourcePageActive()
+  {
+    return getActivePage() == SOURCE_PAGE_INDEX;
+  }
 }