content: /*******************************************************************************
   * Copyright (c) 2000, 2009 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.actions;
  
  import java.util.ArrayList;
  import java.util.List;
  
  import org.eclipse.jface.dialogs.IDialogConstants;
  import org.eclipse.jface.dialogs.IDialogSettings;
  import org.eclipse.jface.viewers.CheckboxTreeViewer;
  import org.eclipse.jface.viewers.DoubleClickEvent;
  import org.eclipse.jface.viewers.IDoubleClickListener;
  import org.eclipse.jface.viewers.ILabelProvider;
  import org.eclipse.jface.viewers.ISelectionChangedListener;
  import org.eclipse.jface.viewers.IStructuredSelection;
  import org.eclipse.jface.viewers.SelectionChangedEvent;
  import org.eclipse.swt.SWT;
  import org.eclipse.swt.events.SelectionAdapter;
  import org.eclipse.swt.events.SelectionEvent;
  import org.eclipse.swt.events.SelectionListener;
  import org.eclipse.swt.layout.GridData;
  import org.eclipse.swt.layout.GridLayout;
  import org.eclipse.swt.widgets.Button;
  import org.eclipse.swt.widgets.Combo;
  import org.eclipse.swt.widgets.Composite;
  import org.eclipse.swt.widgets.Control;
  import org.eclipse.swt.widgets.Label;
  import org.eclipse.swt.widgets.Link;
  import org.eclipse.swt.widgets.Shell;
  import org.eclipse.ui.PlatformUI;
  import org.eclipse.wst.jsdt.core.IType;
  import org.eclipse.wst.jsdt.core.JavaScriptModelException;
  import org.eclipse.wst.jsdt.core.dom.IFunctionBinding;
  import org.eclipse.wst.jsdt.internal.corext.template.java.CodeTemplateContextType;
  import org.eclipse.wst.jsdt.internal.ui.IJavaHelpContextIds;
  import org.eclipse.wst.jsdt.internal.ui.JavaScriptPlugin;
  import org.eclipse.wst.jsdt.internal.ui.dialogs.SourceActionDialog;
  import org.eclipse.wst.jsdt.internal.ui.javaeditor.CompilationUnitEditor;
  import org.eclipse.wst.jsdt.internal.ui.refactoring.IVisibilityChangeListener;
  import org.eclipse.wst.jsdt.internal.ui.viewsupport.BindingLabelProvider;
  
  public class GenerateConstructorUsingFieldsSelectionDialog extends SourceActionDialog {
  
  	class GenerateConstructorUsingFieldsTreeViewerAdapter implements ISelectionChangedListener, IDoubleClickListener {
  
  		public void doubleClick(DoubleClickEvent event) {
  			// Do nothing
  		}
  
  		public void selectionChanged(SelectionChangedEvent event) {
  			IStructuredSelection selection= (IStructuredSelection) getTreeViewer().getSelection();
  
  			List selectedList= selection.toList();
  			GenerateConstructorUsingFieldsContentProvider cp= (GenerateConstructorUsingFieldsContentProvider) getContentProvider();
  
  			fButtonControls[GenerateConstructorUsingFieldsSelectionDialog.UP_INDEX].setEnabled(cp.canMoveUp(selectedList));
  			fButtonControls[GenerateConstructorUsingFieldsSelectionDialog.DOWN_INDEX].setEnabled(cp.canMoveDown(selectedList));
  		}
  	}
  
  	private static final int DOWN_BUTTON= IDialogConstants.CLIENT_ID + 2;
  
  	private static final int UP_BUTTON= IDialogConstants.CLIENT_ID + 1;
  
  	protected Button[] fButtonControls;
  
  	boolean[] fButtonsEnabled;
  
  	IDialogSettings fGenConstructorSettings;
  
  	int fHeight= 18;
  
  	boolean fOmitSuper;
  
  	Button fOmitSuperButton;
  
  	IFunctionBinding[] fSuperConstructors;
  
  	int fSuperIndex;
  
  	GenerateConstructorUsingFieldsTreeViewerAdapter fTreeViewerAdapter;
  
  	int fWidth= 60;
  
  	final String OMIT_SUPER= "OmitCallToSuper"; //$NON-NLS-1$
  
  	final String SETTINGS_SECTION= "GenerateConstructorUsingFieldsSelectionDialog"; //$NON-NLS-1$
  
  	private static final int DOWN_INDEX= 1;
  
  	private static final int UP_INDEX= 0;
  
  	public GenerateConstructorUsingFieldsSelectionDialog(Shell parent, ILabelProvider labelProvider, GenerateConstructorUsingFieldsContentProvider contentProvider, CompilationUnitEditor editor, IType type, IFunctionBinding[] superConstructors) throws JavaScriptModelException {
  		super(parent, labelProvider, contentProvider, editor, type, true);
  		fTreeViewerAdapter= new GenerateConstructorUsingFieldsTreeViewerAdapter();
  
  		fSuperConstructors= superConstructors;
  
  		IDialogSettings dialogSettings= JavaScriptPlugin.getDefault().getDialogSettings();
  		fGenConstructorSettings= dialogSettings.getSection(SETTINGS_SECTION);
  		if (fGenConstructorSettings == null) {
  			fGenConstructorSettings= dialogSettings.addNewSection(SETTINGS_SECTION);
  			fGenConstructorSettings.put(OMIT_SUPER, false); 
  		}
  
  		fOmitSuper= fGenConstructorSettings.getBoolean(OMIT_SUPER);
  	}
  
  	Composite addSuperClassConstructorChoices(Composite composite) {
  		Label label= new Label(composite, SWT.NONE);
  		label.setText(ActionMessages.GenerateConstructorUsingFieldsSelectionDialog_sort_constructor_choices_label); 
  		GridData gd= new GridData(GridData.FILL_HORIZONTAL);
  		label.setLayoutData(gd);
  
  		BindingLabelProvider provider= new BindingLabelProvider();
  		final Combo combo= new Combo(composite, SWT.READ_ONLY);
  		for (int i= 0; i < fSuperConstructors.length; i++) {
  			combo.add(provider.getText(fSuperConstructors[i]));
  		}
  
  		// TODO: Can we be a little more intelligent about guessing the super() ?
  		combo.setText(combo.getItem(0));
  		combo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
  		combo.addSelectionListener(new SelectionAdapter() {
  
  			public void widgetSelected(SelectionEvent e) {
  				fSuperIndex= combo.getSelectionIndex();
  				// Disable omit super checkbox unless default constructor
  				fOmitSuperButton.setEnabled(getSuperConstructorChoice().getParameterTypes().length == 0);
  				updateOKStatus();
  			}
  		});
  
  		return composite;
  	}
  
  	protected void buttonPressed(int buttonId) {
  		super.buttonPressed(buttonId);
  		switch (buttonId) {
  			case UP_BUTTON: {
  				GenerateConstructorUsingFieldsContentProvider contentProvider= (GenerateConstructorUsingFieldsContentProvider) getTreeViewer().getContentProvider();
  				contentProvider.up(getElementList(), getTreeViewer());
  				updateOKStatus();
  				break;
  			}
  			case DOWN_BUTTON: {
  				GenerateConstructorUsingFieldsContentProvider contentProvider= (GenerateConstructorUsingFieldsContentProvider) getTreeViewer().getContentProvider();
  				contentProvider.down(getElementList(), getTreeViewer());
  				updateOKStatus();
  				break;
  			}
  		}
  	}
  
  	protected void configureShell(Shell shell) {
  		super.configureShell(shell);
  		PlatformUI.getWorkbench().getHelpSystem().setHelp(shell, IJavaHelpContextIds.GENERATE_CONSTRUCTOR_USING_FIELDS_SELECTION_DIALOG);
  	}
  	
  	protected Control createDialogArea(Composite parent) {
  		initializeDialogUnits(parent);
  
  		Composite composite= new Composite(parent, SWT.NONE);
  		GridLayout layout= new GridLayout();
  		GridData gd= null;
  
  		layout.marginHeight= convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
  		layout.marginWidth= convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
  		layout.verticalSpacing= convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
  		layout.horizontalSpacing= convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
  		composite.setLayout(layout);
  
  		Composite classConstructorComposite= addSuperClassConstructorChoices(composite);
  		gd= new GridData(GridData.FILL_BOTH);
  		classConstructorComposite.setLayoutData(gd);
  
  		Composite inner= new Composite(composite, SWT.NONE);
  		GridLayout innerLayout= new GridLayout();
  		innerLayout.numColumns= 2;
  		innerLayout.marginHeight= 0;
  		innerLayout.marginWidth= 0;
  		inner.setLayout(innerLayout);
  
  		Label messageLabel= createMessageArea(inner);
  		if (messageLabel != null) {
  			gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL);
  			gd.horizontalSpan= 2;
  			messageLabel.setLayoutData(gd);
  		}
  
  		CheckboxTreeViewer treeViewer= createTreeViewer(inner);
  		gd= new GridData(GridData.FILL_BOTH);
  		gd.widthHint= convertWidthInCharsToPixels(fWidth);
  		gd.heightHint= convertHeightInCharsToPixels(fHeight);
  		treeViewer.getControl().setLayoutData(gd);
  		treeViewer.addSelectionChangedListener(fTreeViewerAdapter);
  
  		Composite buttonComposite= createSelectionButtons(inner);
  		gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL);
  		buttonComposite.setLayoutData(gd);
  
  		gd= new GridData(GridData.FILL_BOTH);
  		inner.setLayoutData(gd);
  
  		Composite entryComposite= createInsertPositionCombo(composite);
  		entryComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
  
  		Composite commentComposite= createCommentSelection(composite);
  		commentComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
  
  		Composite overrideSuperComposite= createOmitSuper(composite);
  		overrideSuperComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
  
  		Control linkControl= createLinkControl(composite);
  		if (linkControl != null)
  			linkControl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
  
  		gd= new GridData(GridData.FILL_BOTH);
  		composite.setLayoutData(gd);
  
  		applyDialogFont(composite);
  
  		return composite;
  	}
  
  	protected Composite createInsertPositionCombo(Composite composite) {
  		Composite entryComposite= super.createInsertPositionCombo(composite);
  		addVisibilityAndModifiersChoices(entryComposite);
  		return entryComposite;
  	}
  
  	/*
  	 * @see org.eclipse.wst.jsdt.internal.ui.dialogs.SourceActionDialog#createLinkControl(org.eclipse.swt.widgets.Composite)
  	 */
  	protected Control createLinkControl(Composite composite) {
  		Link link= new Link(composite, SWT.WRAP);
  		link.setText(ActionMessages.GenerateConstructorUsingFieldsSelectionDialog_template_link_message); 
  		link.addSelectionListener(new SelectionAdapter() {
  			public void widgetSelected(SelectionEvent e) {
  				openCodeTempatePage(CodeTemplateContextType.CONSTRUCTORCOMMENT_ID);
  			}
  		});
  		link.setToolTipText(ActionMessages.GenerateConstructorUsingFieldsSelectionDialog_template_link_tooltip); 
  		
  		GridData gridData= new GridData(SWT.FILL, SWT.BEGINNING, true, false);
  		gridData.widthHint= convertWidthInCharsToPixels(40); // only expand further if anyone else requires it
  		link.setLayoutData(gridData);
  		return link;
  	}
  
  	protected Composite createOmitSuper(Composite composite) {
  		Composite omitSuperComposite= new Composite(composite, SWT.NONE);
  		GridLayout layout= new GridLayout();
  		layout.marginHeight= 0;
  		layout.marginWidth= 0;
  		omitSuperComposite.setLayout(layout);
  
  		fOmitSuperButton= new Button(omitSuperComposite, SWT.CHECK);
  		fOmitSuperButton.setText(ActionMessages.GenerateConstructorUsingFieldsSelectionDialog_omit_super); 
  		fOmitSuperButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
  
  		fOmitSuperButton.addSelectionListener(new SelectionListener() {
  
  			public void widgetDefaultSelected(SelectionEvent e) {
  				widgetSelected(e);
  			}
  
  			public void widgetSelected(SelectionEvent e) {
  				boolean isSelected= (((Button) e.widget).getSelection());
  				setOmitSuper(isSelected);
  			}
  		});
  		fOmitSuperButton.setSelection(isOmitSuper());
  		
  		// Disable omit super checkbox unless default constructor and enum
  		final boolean hasContructor= getSuperConstructorChoice().getParameterTypes().length == 0;
  		fOmitSuperButton.setEnabled(hasContructor);
  		
  		GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL);
  		gd.horizontalSpan= 2;
  		fOmitSuperButton.setLayoutData(gd);
  
  		return omitSuperComposite;
  	}
  
  	protected Composite createSelectionButtons(Composite composite) {
  		Composite buttonComposite= super.createSelectionButtons(composite);
  
  		GridLayout layout= new GridLayout();
  		buttonComposite.setLayout(layout);
  
  		createUpDownButtons(buttonComposite);
  
  		layout.marginHeight= 0;
  		layout.marginWidth= 0;
  		layout.numColumns= 1;
  
  		return buttonComposite;
  	}
  
  	void createUpDownButtons(Composite buttonComposite) {
  		int numButtons= 2; // up, down
  		fButtonControls= new Button[numButtons];
  		fButtonsEnabled= new boolean[numButtons];
  		fButtonControls[GenerateConstructorUsingFieldsSelectionDialog.UP_INDEX]= createButton(buttonComposite, UP_BUTTON, ActionMessages.GenerateConstructorUsingFieldsSelectionDialog_up_button, false); 
  		fButtonControls[GenerateConstructorUsingFieldsSelectionDialog.DOWN_INDEX]= createButton(buttonComposite, DOWN_BUTTON, ActionMessages.GenerateConstructorUsingFieldsSelectionDialog_down_button, false); 
  		boolean defaultState= false;
  		fButtonControls[GenerateConstructorUsingFieldsSelectionDialog.UP_INDEX].setEnabled(defaultState);
  		fButtonControls[GenerateConstructorUsingFieldsSelectionDialog.DOWN_INDEX].setEnabled(defaultState);
  		fButtonsEnabled[GenerateConstructorUsingFieldsSelectionDialog.UP_INDEX]= defaultState;
  		fButtonsEnabled[GenerateConstructorUsingFieldsSelectionDialog.DOWN_INDEX]= defaultState;
  	}
  
  	protected Composite createVisibilityControlAndModifiers(Composite parent, final IVisibilityChangeListener visibilityChangeListener, int[] availableVisibilities, int correctVisibility) {
  		int[] visibilities= availableVisibilities;
  		return createVisibilityControl(parent, visibilityChangeListener, visibilities, correctVisibility);
  	}
  
  	List getElementList() {
  		IStructuredSelection selection= (IStructuredSelection) getTreeViewer().getSelection();
  		List elements= selection.toList();
  		ArrayList elementList= new ArrayList();
  
  		for (int i= 0; i < elements.size(); i++) {
  			elementList.add(elements.get(i));
  		}
  		return elementList;
  	}
  
  	public IFunctionBinding getSuperConstructorChoice() {
  		return fSuperConstructors[fSuperIndex];
  	}
  
  	public boolean isOmitSuper() {
  		return fOmitSuper;
  	}
  
  	public void setOmitSuper(boolean omitSuper) {
  		if (fOmitSuper != omitSuper) {
  			fOmitSuper= omitSuper;
  			fGenConstructorSettings.put(OMIT_SUPER, omitSuper);
  		}
  	}
  }
  