package com.robotoworks.mechanoid.ui.wizard; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaConventions; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jface.fieldassist.ControlDecoration; import org.eclipse.swt.SWT; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import com.robotoworks.mechanoid.ui.MechanoidPluginImages; import com.robotoworks.mechanoid.ui.MechanoidUiPlugin; import com.robotoworks.mechanoid.ui.Messages; import com.robotoworks.mechanoid.ui.wizard.fields.ContainerBrowserField; import com.robotoworks.mechanoid.ui.wizard.fields.PackageBrowserField; import com.robotoworks.mechanoid.ui.wizard.fields.TextField; public class NewMechanoidElementPage extends MechanoidWizardPage { private ContainerBrowserField mFolderField; private PackageBrowserField mPackageField; private TextField mElementNameField; private Label mFieldInfoLabel; public String getSelectedPackageName() { return mPackageField.getTextField().getText(); } public IPath getSelectedFolderPath() { return mFolderField.getSelectedPath(); } public String getSelectedElementName() { return mElementNameField.getTextField().getText(); } public NewMechanoidElementPage(String pageName) { super(pageName); setPageComplete(false); } public Label getFieldInfoLabel() { return mFieldInfoLabel; } @Override public void createControl(Composite parent) { initializeDialogUnits(parent); // top level group Composite topLevel = new Composite(parent, SWT.NONE); topLevel.setLayout(new GridLayout()); topLevel.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL)); topLevel.setFont(parent.getFont()); //PlatformUI.getWorkbench().getHelpSystem().setHelp(topLevel, // IIDEHelpContextIds.NEW_FILE_WIZARD_PAGE); createFields(topLevel, parent.getFont()); setControl(topLevel); } protected void createFields(Composite parent, Font font) { Composite group = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); layout.numColumns = 3; layout.marginWidth = 0; group.setLayout(layout); group.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL)); group.setFont(font); IContainer initialRoot = getMechanoidWizard().getSelectedFolder() != null ? getMechanoidWizard().getSelectedFolder() : getMechanoidWizard().getSelectedProject(); mFolderField = new ContainerBrowserField(group, Messages.NewMechanoidElementPage_Widget_Label_Folder, initialRoot); mFolderField.getTextField().addModifyListener(mValidatingModifyListener); mFolderField.getTextField().addFocusListener(mFieldFocusedListener); mPackageField = new PackageBrowserField(group, Messages.NewMechanoidElementPage_Widget_Label_Package); mPackageField.setJavaProject(getMechanoidWizard().getSelectedJavaProject()); mPackageField.getTextField().addModifyListener(mValidatingModifyListener); mPackageField.getTextField().addFocusListener(mFieldFocusedListener); mElementNameField = new TextField(group, Messages.NewMechanoidElementPage_Widget_Label_Name); mElementNameField.getTextField().addModifyListener(mValidatingModifyListener); mElementNameField.getTextField().addFocusListener(mFieldFocusedListener); mElementNameField.getTextField().addFocusListener(mFieldFocusedListener); onAfterAddNameField(group, font); Label seperator = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL); seperator.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); createFieldInfoLabel(parent); //createAddMechanoidLibraryGroup(parent); } protected void onAfterAddNameField(Composite parent, Font font) { } private FocusListener mFieldFocusedListener = new FocusListener() { @Override public void focusLost(FocusEvent e) {} @Override public void focusGained(FocusEvent e) { if(e.widget == mFolderField.getTextField()) { mFieldInfoLabel.setText(getFolderFieldInfoMessage()); } else if(e.widget == mPackageField.getTextField()) { mFieldInfoLabel.setText(getPackageFieldInfoMessage()); } else if(e.widget == mElementNameField.getTextField()) { mFieldInfoLabel.setText(getNameFieldInfoMessage()); } mFieldInfoLabel.getParent().layout(); } }; protected String getFolderFieldInfoMessage() { return Messages.NewMechanoidElementPage_Widget_Label_Message_Folder; } protected String getPackageFieldInfoMessage() { return Messages.NewMechanoidElementPage_Widget_Label_Message_Package; } protected String getNameFieldInfoMessage() { return Messages.NewMechanoidElementPage_Widget_Label_Message_Name; } private void createFieldInfoLabel(Composite parent) { Composite comp = new Composite(parent, SWT.NONE); comp.setLayout(new GridLayout(1, true)); comp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); mFieldInfoLabel = new Label(comp, SWT.WRAP); GridData labelLayoutData = new GridData(SWT.FILL, SWT.FILL, true, true); labelLayoutData.horizontalIndent = 24; mFieldInfoLabel.setLayoutData(labelLayoutData); final ControlDecoration deco = new ControlDecoration(mFieldInfoLabel, SWT.LEFT | SWT.TOP); Image decoImage = MechanoidUiPlugin.getPlugin().getImageRegistry().get(MechanoidPluginImages.IMG_INFO_LABEL); //Image decoImage = FieldDecorationRegistry.getDefault().getFieldDecoration(FieldDecorationRegistry.DEC_ERROR_QUICKFIX).getImage(); deco.setMarginWidth(8); deco.setImage(decoImage); } // UNDONE: Implement this later // private boolean isMechanoidLibraryOnClassPath() { // IProject project = mFolderField.getSelectedProject(); // // // TODO // return false; // } // // private void createAddMechanoidLibraryGroup(Composite parent) { // Group group = new Group(parent, SWT.NONE); // group.setFont(parent.getFont()); // group.setText(Messages.NewMechanoidElementPage_Widget_Group_Mechanoid_Library); // group.setLayout(new GridLayout(1, false)); // group.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); // // Label label = new Label(group, SWT.NONE); // label.setFont(group.getFont()); // label.setText(Messages.NewMechanoidElementPage_Widget_Group_Mechanoid_Library_Message); // label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); // // Button enableButton = new Button(group, SWT.CHECK); // enableButton.setFont(group.getFont()); // enableButton.setText(Messages.NewMechanoidElementPage_Widget_Group_Button_Label_Mechanoid_Library); // enableButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); // enableButton.setSelection(true); // } private ModifyListener mValidatingModifyListener = new ModifyListener() { @Override public void modifyText(ModifyEvent e) { validateAll(); } }; private void validateAll() { setPageComplete(false); if(!validateFolderField()) { return; } onFolderFieldValid(); if(!validatePackageField()) { return; } if(!validateNameField()) { return; } setPageComplete(true); } private void onFolderFieldValid() { IProject project = mFolderField.getSelectedProject(); IJavaProject javaProj = JavaCore.create(project); mPackageField.setJavaProject(javaProj); } private boolean validateFolderField() { if(mFolderField.getSelectedPath().isEmpty()) { setErrorMessage(Messages.NewMechanoidElementPage_Widget_Field_ValidationMessage_Required_Folder); return false; } else { IProject project = mFolderField.getSelectedProject(); if(project == null) { setErrorMessage(Messages.NewMechanoidElementPage_Widget_Field_ValidationMessage_Invalid_Folder); return false; } } setErrorMessage(null); return true; } private boolean validatePackageField() { String packageText = mPackageField.getTextField().getText(); if(packageText.length() == 0) { setErrorMessage(Messages.NewMechanoidElementPage_Widget_Field_ValidationMessage_Required_Package); return false; } IStatus status = JavaConventions.validatePackageName( packageText, JavaCore.VERSION_1_3, JavaCore.VERSION_1_3); if(!status.isOK()) { setErrorMessage(status.getMessage()); return false; } setErrorMessage(null); return true; } private boolean validateNameField() { String name = mElementNameField.getTextField().getText(); if(name.length() == 0) { setErrorMessage(Messages.NewMechanoidElementPage_Widget_Field_ValidationMessage_Required_Name); return false; } // TODO does this need to be more specific? IStatus status = JavaConventions.validateIdentifier(name, JavaCore.VERSION_1_3, JavaCore.VERSION_1_3); if(!status.isOK()) { setErrorMessage(String.format(Messages.NewMechanoidElementPage_Widget_Field_ValidationMessage_Invalid_Name, name)); return false; } setErrorMessage(null); return true; } }