/*******************************************************************************
* Copyright (c) 2005, 2012 eBay Inc.
* 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
*
*******************************************************************************/
/**
*
*/
package org.eclipse.vjet.eclipse.internal.ui.wizards;
import static org.eclipse.vjet.eclipse.internal.ui.wizards.VjetWizardMessages.ClassCreationWizard_abstract;
import static org.eclipse.vjet.eclipse.internal.ui.wizards.VjetWizardMessages.ClassCreationWizard_browse;
import static org.eclipse.vjet.eclipse.internal.ui.wizards.VjetWizardMessages.ClassCreationWizard_superclass;
import static org.eclipse.vjet.eclipse.internal.ui.wizards.VjetWizardMessages.ClassCreationWizard_superclass_selection;
import org.eclipse.vjet.dsf.jst.IJstType;
import org.eclipse.vjet.eclipse.core.VjoNature;
import org.eclipse.vjet.eclipse.internal.ui.dialogs.VjoOpenTypeSelectionDialog;
import org.eclipse.vjet.eclipse.internal.ui.wizards.dialogfields.CheckBoxDialogField;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.dltk.mod.core.DLTKCore;
import org.eclipse.dltk.mod.core.IModelElement;
import org.eclipse.dltk.mod.core.IScriptProject;
import org.eclipse.dltk.mod.core.IType;
import org.eclipse.dltk.mod.core.ModelException;
import org.eclipse.dltk.mod.core.search.IDLTKSearchConstants;
import org.eclipse.dltk.mod.core.search.IDLTKSearchScope;
import org.eclipse.dltk.mod.internal.ui.DLTKUIMessages;
import org.eclipse.dltk.mod.internal.ui.wizards.dialogfields.DialogField;
import org.eclipse.dltk.mod.internal.ui.wizards.dialogfields.IDialogFieldListener;
import org.eclipse.dltk.mod.internal.ui.wizards.dialogfields.IStringButtonAdapter;
import org.eclipse.dltk.mod.internal.ui.wizards.dialogfields.StringButtonDialogField;
import org.eclipse.dltk.mod.ui.DLTKUILanguageManager;
import org.eclipse.dltk.mod.ui.DLTKUIPlugin;
import org.eclipse.dltk.mod.ui.IDLTKUILanguageToolkit;
import org.eclipse.dltk.mod.ui.viewsupport.IViewPartInputProvider;
import org.eclipse.jdt.internal.core.PackageFragment;
import org.eclipse.jdt.internal.ui.refactoring.contentassist.ControlContentAssistHelper;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.views.contentoutline.ContentOutline;
/**
* The page for creating a new vjo class.
*
*/
public final class VjoClassCreationPage extends VjoSourceModulePage {
private CheckBoxDialogField isAbstractButton;
protected StringButtonDialogField superclassField;
private CheckBoxDialogField mainStubsButton;
private CheckBoxDialogField constructorStubsButton;
// private SelectionButtonDialogFieldGroup fMethodStubsButtons;
private IJstType baseType;
/**
* @param vjoClassCreationWizard
*/
public VjoClassCreationPage() {
super();
fCurrSuperTypeCompletionProcessor = new VjoSuperTypeCompletionProcessor();
}
@Override
public void createControl(Composite parent) {
// TODO Auto-generated method stub
super.createControl(parent);
PlatformUI.getWorkbench().getHelpSystem().setHelp(parent,
IHelpContextIds.NEW_CTYPE);
}
@Override
protected String getPageDescription() {
return VjetWizardMessages.ClassCreationWizard_page_description;
}
@Override
protected String getPageTitle() {
return VjetWizardMessages.ClassCreationWizard_page_title;
}
@Override
protected String getRequiredNature() {
return VjoNature.NATURE_ID;
}
@Override
protected String getPageType() {
return "ctype";
}
@Override
protected void createFileControls(Composite parent, int columns) {
super.createFileControls(parent, columns);
// this.createAbstractButton(parent, columns);
this.createSuperClassField(parent, columns);
// this.createMethodStubButton(parent, columns);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.dltk.mod.ui.wizards.NewContainerWizardPage#getInitialScriptElement(org.eclipse.jface.viewers.IStructuredSelection)
*/
protected IModelElement getInitialScriptElement(
IStructuredSelection selection) {
IModelElement scriptElement = null;
// Check selection
if (selection != null && !selection.isEmpty()) {
Object selectedElement = selection.getFirstElement();
// Check for adapters
if (selectedElement instanceof IAdaptable) {
IAdaptable adaptable = (IAdaptable) selectedElement;
scriptElement = (IModelElement) adaptable
.getAdapter(IModelElement.class);
if (scriptElement == null) {
IResource resource = (IResource) adaptable
.getAdapter(IResource.class);
scriptElement = (IModelElement) resource
.getAdapter(IModelElement.class);
if (scriptElement == null) {
scriptElement = DLTKCore.create(resource);
}
}
} else {
// scriptElement = selectedElement;
}
}
// Check view
if (scriptElement == null) {
IWorkbenchPart part = DLTKUIPlugin.getActivePage().getActivePart();
if (part instanceof ContentOutline) {
part = DLTKUIPlugin.getActivePage().getActiveEditor();
}
if (part instanceof IViewPartInputProvider) {
Object provider = ((IViewPartInputProvider) part)
.getViewPartInput();
if (provider instanceof IModelElement) {
scriptElement = (IModelElement) provider;
}
}
}
if (scriptElement == null
|| scriptElement.getElementType() == IModelElement.SCRIPT_MODEL) {
try {
IScriptProject[] projects = DLTKCore.create(getWorkspaceRoot())
.getScriptProjects();
if (projects.length == 1) {
scriptElement = projects[0];
}
} catch (ModelException e) {
DLTKUIPlugin.log(e);
}
}
return scriptElement;
}
private boolean isPackageFragment(Object selectedElement) {
return (selectedElement instanceof PackageFragment);
}
protected void createAbstractButton(Composite parent, int columns) {
isAbstractButton = new CheckBoxDialogField(SWT.CHECK);
isAbstractButton.setLabelText("");
isAbstractButton.setCheckBoxText(ClassCreationWizard_abstract);
isAbstractButton.doFillIntoGrid(parent, columns);
}
private VjoSuperTypeCompletionProcessor fCurrSuperTypeCompletionProcessor;
protected void createSuperClassField(Composite parent, int columns) {
SearchButtonAdapter adapter = new SearchButtonAdapter();
superclassField = new StringButtonDialogField(adapter);
superclassField.setLabelText(ClassCreationWizard_superclass);
superclassField.setButtonLabel(ClassCreationWizard_browse);
superclassField.doFillIntoGrid(parent, columns);
superclassField.setDialogFieldListener(adapter);
// Add by Oliver. 2009-06-17. Add the super type proposal for super type
// text box.
Text text = superclassField.getTextControl(parent);
ControlContentAssistHelper.createTextContentAssistant(text,
fCurrSuperTypeCompletionProcessor);
}
protected void createExtraControls(Composite parent, int columns) {
Link link = new Link(parent, SWT.NONE);
link.setText(VjetWizardMessages.ClassCreationWizard_methods_label);
link.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, false,
false, columns, 1));
mainStubsButton = new CheckBoxDialogField(SWT.CHECK);
mainStubsButton
.setCheckBoxText(VjetWizardMessages.ClassCreationWizard_methods_main);
mainStubsButton.doFillIntoGrid(parent, columns);
constructorStubsButton = new CheckBoxDialogField(SWT.CHECK);
constructorStubsButton
.setCheckBoxText(VjetWizardMessages.NewClassWizardPage_methods_constructors);
constructorStubsButton.doFillIntoGrid(parent, columns);
}
public String getSuperclassFieldText() {
return superclassField.getText();
}
public boolean isAbstractButtonSelected() {
return isAbstractButton.isSelected();
}
public void setAbstractButton(boolean isAbstract) {
if (isAbstractButton == null)
isAbstractButton = new CheckBoxDialogField(SWT.CHECK);
isAbstractButton.setSelection(isAbstract);
}
public void setSuperclassFieldText(String superclass) {
this.superclassField.setText(superclass);
}
public void initializeSuperClassField() {
if (this.superclassField == null) {
SearchButtonAdapter adapter = new SearchButtonAdapter();
this.superclassField = new StringButtonDialogField(adapter);
}
}
public boolean isMethodStubsButtonSelected() {
return mainStubsButton.isSelected();
}
public void setMethodStubGeneration(boolean isMethodStubGeneration) {
if (mainStubsButton == null)
mainStubsButton = new CheckBoxDialogField(SWT.CHECK);
mainStubsButton.setSelection(isMethodStubGeneration);
}
public boolean isConstructorButtonSelected() {
return constructorStubsButton.isSelected();
}
public void setConstructorStubGeneration(boolean isMethodStubGeneration) {
if (constructorStubsButton == null)
constructorStubsButton = new CheckBoxDialogField(SWT.CHECK);
constructorStubsButton.setSelection(isMethodStubGeneration);
}
protected final class SearchButtonAdapter implements IStringButtonAdapter,
IDialogFieldListener {
public void changeControlPressed(DialogField field) {
baseType = chooseSuperclass();
if (baseType != null) {
setSuperclassFieldText(baseType.getName());
}
}
public void dialogFieldChanged(DialogField field) {
// nothing
}
}
/**
* Gets the parent class by active shell and returns the name of choosen
* class.
*
* @return the name of super class.
*/
protected IJstType chooseSuperclass() {
// String className = null;
Shell parent = DLTKUIPlugin.getActiveWorkbenchShell();
VjoOpenTypeSelectionDialog dialog = new VjoOpenTypeSelectionDialog(
parent, true, PlatformUI.getWorkbench().getProgressService(),
getSearchScope(), IDLTKSearchConstants.TYPE, this
.getUILanguageToolkit());
dialog.setShownTypeFlag(VjoOpenTypeSelectionDialog.SHOWCTYPEONLY);
dialog.setTitle(getOpenTypeDialogTitle());
dialog.setMessage(getOpenTypeDialogMessage());
// Add by Oliver, 2009-02-25.
// Fix bug--http://quickbugstage.arch.ebay.com/show_bug.cgi?id=2337
String inputtedSuperClassName = getSuperclassFieldText();
if (inputtedSuperClassName != null
&& inputtedSuperClassName.trim().length() > 0) {
dialog.setFilter(inputtedSuperClassName.trim());
}
int result = dialog.open();
if (result != IDialogConstants.OK_ID)
return null;
Object[] types = dialog.getResult();
if (types != null && types.length > 0) {
IType type = null;
type = (IType) types[0];
return org.eclipse.vjet.eclipse.internal.core.util.Util.toJstType(type);
// for (int i = 0; i < types.length; i++) {
// type = (IJstType) types[i];
// // IFile file = (IFile) type.getResource();
// className = type.getName();
// }
}
return null;
}
protected IDLTKSearchScope getSearchScope() {
return null;
}
protected String getOpenTypeDialogTitle() {
return ClassCreationWizard_superclass_selection;
}
protected IDLTKUILanguageToolkit getUILanguageToolkit() {
return DLTKUILanguageManager.getLanguageToolkit(VjoNature.NATURE_ID);
}
protected String getOpenTypeDialogMessage() {
return DLTKUIMessages.OpenTypeAction_dialogMessage;
}
public IJstType getBaseType() {
return baseType;
}
}