content: /*******************************************************************************
   * Copyright (c) 2000, 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
   * http://www.eclipse.org/legal/epl-v10.html
   *
   * Contributors:
   *     IBM Corporation - initial API and implementation
   *******************************************************************************/
  package org.eclipse.wst.jsdt.internal.ui.refactoring.reorg;
  
  import org.eclipse.core.resources.IResource;
  import org.eclipse.jface.dialogs.Dialog;
  import org.eclipse.jface.viewers.ITreeContentProvider;
  import org.eclipse.jface.viewers.StructuredSelection;
  import org.eclipse.jface.viewers.TreeViewer;
  import org.eclipse.ltk.core.refactoring.RefactoringStatus;
  import org.eclipse.ltk.core.refactoring.participants.MoveRefactoring;
  import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
  import org.eclipse.swt.SWT;
  import org.eclipse.swt.events.SelectionAdapter;
  import org.eclipse.swt.events.SelectionEvent;
  import org.eclipse.swt.events.TraverseEvent;
  import org.eclipse.swt.events.TraverseListener;
  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.wst.jsdt.core.IJavaScriptElement;
  import org.eclipse.wst.jsdt.core.JavaScriptModelException;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.reorg.ICreateTargetQuery;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.reorg.IReorgDestinationValidator;
  import org.eclipse.wst.jsdt.internal.corext.refactoring.reorg.JavaMoveProcessor;
  import org.eclipse.wst.jsdt.internal.ui.refactoring.QualifiedNameComponent;
  import org.eclipse.wst.jsdt.internal.ui.refactoring.RefactoringMessages;
  import org.eclipse.wst.jsdt.internal.ui.util.SWTUtil;
  
  
  public class ReorgMoveWizard extends RefactoringWizard {
  
  	public ReorgMoveWizard(MoveRefactoring ref) {
  		super(ref, DIALOG_BASED_USER_INTERFACE | computeHasPreviewPage(ref));
  		if (isTextualMove(ref))
  			setDefaultPageTitle(ReorgMessages.ReorgMoveWizard_textual_move); 
  		else
  			setDefaultPageTitle(ReorgMessages.ReorgMoveWizard_3); 
  	}
  	
  	private static boolean isTextualMove(MoveRefactoring ref) {
  		JavaMoveProcessor moveProcessor= (JavaMoveProcessor) ref.getAdapter(JavaMoveProcessor.class);
  		return moveProcessor.isTextualMove();
  	}
  
  	private static int computeHasPreviewPage(MoveRefactoring refactoring) {
  		JavaMoveProcessor processor= (JavaMoveProcessor)refactoring.getAdapter(JavaMoveProcessor.class);
  		if (processor.canUpdateReferences() || processor.canEnableQualifiedNameUpdating())
  			return NONE;
  		return NO_PREVIEW_PAGE;
  	}
  
  	protected void addUserInputPages() {
  		addPage(new MoveInputPage());
  	}
  	
  	private static class MoveInputPage extends ReorgUserInputPage{
  
  		private static final String PAGE_NAME= "MoveInputPage"; //$NON-NLS-1$
  		private Button fReferenceCheckbox;
  		private Button fQualifiedNameCheckbox;
  		private QualifiedNameComponent fQualifiedNameComponent;
  		private ICreateTargetQuery fCreateTargetQuery;
  		
  		private Object fDestination;
  		
  		public MoveInputPage() {
  			super(PAGE_NAME);
  		}
  
  		private JavaMoveProcessor getJavaMoveProcessor(){
  			return (JavaMoveProcessor)getRefactoring().getAdapter(JavaMoveProcessor.class);
  		}
  
  		protected Object getInitiallySelectedElement() {
  			return getJavaMoveProcessor().getCommonParentForInputElements();
  		}
  		
  		protected IJavaScriptElement[] getJavaElements() {
  			return getJavaMoveProcessor().getJavaElements();
  		}
  
  		protected IResource[] getResources() {
  			return getJavaMoveProcessor().getResources();
  		}
  
  		protected IReorgDestinationValidator getDestinationValidator() {
  			return getJavaMoveProcessor();
  		}
  
  		protected boolean performFinish() {
  			return super.performFinish() || getJavaMoveProcessor().wasCanceled(); //close the dialog if canceled
  		}
  		
  		protected RefactoringStatus verifyDestination(Object selected) throws JavaScriptModelException{
  			JavaMoveProcessor processor= getJavaMoveProcessor();
  			final RefactoringStatus refactoringStatus;
  			if (selected instanceof IJavaScriptElement)
  				refactoringStatus= processor.setDestination((IJavaScriptElement)selected);
  			else if (selected instanceof IResource)
  				refactoringStatus= processor.setDestination((IResource)selected);
  			else refactoringStatus= RefactoringStatus.createFatalErrorStatus(ReorgMessages.ReorgMoveWizard_4); 
  			
  			updateUIStatus();
  			fDestination= selected;
  			return refactoringStatus;
  		}
  	
  		private void updateUIStatus() {
  			getRefactoringWizard().setForcePreviewReview(false);
  			JavaMoveProcessor processor= getJavaMoveProcessor();
  			if (fReferenceCheckbox != null){
  				fReferenceCheckbox.setEnabled(canUpdateReferences());
  				processor.setUpdateReferences(fReferenceCheckbox.getEnabled() && fReferenceCheckbox.getSelection());
  			}
  			if (fQualifiedNameCheckbox != null){
  				boolean enabled= processor.canEnableQualifiedNameUpdating();
  				fQualifiedNameCheckbox.setEnabled(enabled);
  				if (enabled) {
  					fQualifiedNameComponent.setEnabled(processor.getUpdateQualifiedNames());
  					if (processor.getUpdateQualifiedNames())
  						getRefactoringWizard().setForcePreviewReview(true);
  				} else {
  					fQualifiedNameComponent.setEnabled(false);
  				}
  				processor.setUpdateQualifiedNames(fQualifiedNameCheckbox.getEnabled() && fQualifiedNameCheckbox.getSelection());
  			}
  		}
  
  		private void addUpdateReferenceComponent(Composite result) {
  			final JavaMoveProcessor processor= getJavaMoveProcessor();
  			if (! processor.canUpdateReferences())
  				return;
  			fReferenceCheckbox= new Button(result, SWT.CHECK);
  			fReferenceCheckbox.setText(ReorgMessages.JdtMoveAction_update_references); 
  			fReferenceCheckbox.setSelection(processor.getUpdateReferences());
  			fReferenceCheckbox.setEnabled(canUpdateReferences());
  			
  			fReferenceCheckbox.addSelectionListener(new SelectionAdapter() {
  				public void widgetSelected(SelectionEvent e) {
  					processor.setUpdateReferences(((Button)e.widget).getSelection());
  					updateUIStatus();
  				}
  			});
  		}
  
  		private void addUpdateQualifiedNameComponent(Composite parent, int marginWidth) {
  			final JavaMoveProcessor processor= getJavaMoveProcessor();
  			if (!processor.canEnableQualifiedNameUpdating() || !processor.canUpdateQualifiedNames())
  				return;
  			fQualifiedNameCheckbox= new Button(parent, SWT.CHECK);
  			int indent= marginWidth + fQualifiedNameCheckbox.computeSize(SWT.DEFAULT, SWT.DEFAULT).x;
  			fQualifiedNameCheckbox.setText(RefactoringMessages.RenameInputWizardPage_update_qualified_names); 
  			fQualifiedNameCheckbox.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
  			fQualifiedNameCheckbox.setSelection(processor.getUpdateQualifiedNames());
  		
  			fQualifiedNameComponent= new QualifiedNameComponent(parent, SWT.NONE, processor, getRefactoringSettings());
  			fQualifiedNameComponent.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
  			GridData gd= (GridData)fQualifiedNameComponent.getLayoutData();
  			gd.horizontalAlignment= GridData.FILL;
  			gd.horizontalIndent= indent;
  			updateQualifiedNameUpdating(processor, processor.getUpdateQualifiedNames());
  
  			fQualifiedNameCheckbox.addSelectionListener(new SelectionAdapter() {
  				public void widgetSelected(SelectionEvent e) {
  					boolean enabled= ((Button)e.widget).getSelection();
  					updateQualifiedNameUpdating(processor, enabled);
  				}
  
  			});
  		}
  		
  		private void updateQualifiedNameUpdating(final JavaMoveProcessor processor, boolean enabled) {
  			fQualifiedNameComponent.setEnabled(enabled);
  			processor.setUpdateQualifiedNames(enabled);
  			updateUIStatus();
  		}
  		
  		public void createControl(Composite parent) {
  			Composite result;
  			
  			boolean showDestinationTree= ! getJavaMoveProcessor().hasDestinationSet();
  			if (showDestinationTree) {
  				fCreateTargetQuery= getJavaMoveProcessor().getCreateTargetQuery();
  				super.createControl(parent);
  				getTreeViewer().getTree().setFocus();
  				result= (Composite)super.getControl();
  			} else  {
  				initializeDialogUnits(parent);
  				result= new Composite(parent, SWT.NONE);
  				setControl(result);
  				result.setLayout(new GridLayout());
  				Dialog.applyDialogFont(result);
  			}
  			addUpdateReferenceComponent(result);
  			addUpdateQualifiedNameComponent(result, ((GridLayout)result.getLayout()).marginWidth);
  			setControl(result);
  			Dialog.applyDialogFont(result);
  		}
  
  		protected Control addLabel(Composite parent) {
  			if (fCreateTargetQuery != null) {
  				Composite firstLine= new Composite(parent, SWT.NONE);
  				GridLayout layout= new GridLayout(2, false);
  				layout.marginHeight= layout.marginWidth= 0;
  				firstLine.setLayout(layout);
  				firstLine.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
  				
  				Control label= super.addLabel(firstLine);
  				label.addTraverseListener(new TraverseListener() {
  					public void keyTraversed(TraverseEvent e) {
  						if (e.detail == SWT.TRAVERSE_MNEMONIC && e.doit) {
  							e.detail= SWT.TRAVERSE_NONE;
  							getTreeViewer().getTree().setFocus();
  						}
  					}
  				});
  				
  				Button newButton= new Button(firstLine, SWT.PUSH);
  				newButton.setText(fCreateTargetQuery.getNewButtonLabel());
  				GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.GRAB_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
  				gd.widthHint = SWTUtil.getButtonWidthHint(newButton);
  				newButton.setLayoutData(gd);
  				newButton.addSelectionListener(new SelectionAdapter() {
  					public void widgetSelected(SelectionEvent e) {
  						doNewButtonPressed();
  					}
  				});
  				
  				return firstLine;
  				
  			} else {
  				return super.addLabel(parent);
  			}
  		}
  		
  		private boolean canUpdateReferences() {
  			return getJavaMoveProcessor().canUpdateReferences();
  		}
  
  		private void doNewButtonPressed() {
  			Object newElement= fCreateTargetQuery.getCreatedTarget(fDestination);
  			if (newElement != null) {
  				TreeViewer viewer= getTreeViewer();
  				ITreeContentProvider contentProvider= (ITreeContentProvider) viewer.getContentProvider();
  				viewer.refresh(contentProvider.getParent(newElement));
  				viewer.setSelection(new StructuredSelection(newElement), true);
  				viewer.getTree().setFocus();
  			}
  		}
  	}
  }
  