| /* |
| * Copyright 2000-2009 JetBrains s.r.o. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package com.intellij.uiDesigner.wizard; |
| |
| import com.intellij.ide.util.ClassFilter; |
| import com.intellij.ide.util.PackageChooserDialog; |
| import com.intellij.ide.util.TreeClassChooser; |
| import com.intellij.ide.util.TreeClassChooserFactory; |
| import com.intellij.ide.wizard.CommitStepException; |
| import com.intellij.ide.wizard.StepAdapter; |
| import com.intellij.openapi.module.Module; |
| import com.intellij.openapi.module.ModuleUtil; |
| import com.intellij.openapi.ui.TextFieldWithBrowseButton; |
| import com.intellij.openapi.util.Comparing; |
| import com.intellij.psi.*; |
| import com.intellij.psi.search.GlobalSearchScope; |
| import com.intellij.uiDesigner.UIDesignerBundle; |
| import org.jetbrains.annotations.NotNull; |
| |
| import javax.swing.*; |
| import java.awt.event.ActionEvent; |
| import java.awt.event.ActionListener; |
| import java.awt.event.ItemEvent; |
| import java.awt.event.ItemListener; |
| |
| /** |
| * @author Anton Katilin |
| * @author Vladimir Kondratyev |
| */ |
| final class BeanStep extends StepAdapter{ |
| private JPanel myComponent; |
| private TextFieldWithBrowseButton myTfWitgBtnChooseClass; |
| private JRadioButton myRbBindToNewBean; |
| private JRadioButton myRbBindToExistingBean; |
| JTextField myTfShortClassName; |
| private TextFieldWithBrowseButton myTfWithBtnChoosePackage; |
| private JLabel myPackageLabel; |
| private JLabel myExistClassLabel; |
| private final WizardData myData; |
| |
| public BeanStep(@NotNull final WizardData data) { |
| myData = data; |
| |
| myPackageLabel.setLabelFor(myTfWithBtnChoosePackage.getTextField()); |
| myExistClassLabel.setLabelFor(myTfWitgBtnChooseClass.getTextField()); |
| |
| final ItemListener itemListener = new ItemListener() { |
| public void itemStateChanged(final ItemEvent e) { |
| final boolean state = myRbBindToNewBean.isSelected(); |
| |
| myTfShortClassName.setEnabled(state); |
| myTfWithBtnChoosePackage.setEnabled(state); |
| |
| myTfWitgBtnChooseClass.setEnabled(!state); |
| } |
| }; |
| myRbBindToNewBean.addItemListener(itemListener); |
| myRbBindToExistingBean.addItemListener(itemListener); |
| |
| { |
| final ButtonGroup buttonGroup = new ButtonGroup(); |
| buttonGroup.add(myRbBindToNewBean); |
| buttonGroup.add(myRbBindToExistingBean); |
| } |
| |
| myTfWitgBtnChooseClass.addActionListener( |
| new ActionListener() { |
| public void actionPerformed(final ActionEvent e) { |
| final TreeClassChooser chooser = TreeClassChooserFactory.getInstance(myData.myProject).createWithInnerClassesScopeChooser( |
| UIDesignerBundle.message("title.choose.bean.class"), |
| GlobalSearchScope.projectScope(myData.myProject), |
| new ClassFilter() { |
| public boolean isAccepted(final PsiClass aClass) { |
| return aClass.getParent() instanceof PsiJavaFile; |
| } |
| }, |
| null); |
| chooser.showDialog(); |
| final PsiClass aClass = chooser.getSelected(); |
| if (aClass == null) { |
| return; |
| } |
| final String fqName = aClass.getQualifiedName(); |
| myTfWitgBtnChooseClass.setText(fqName); |
| } |
| } |
| ); |
| |
| myTfWithBtnChoosePackage.addActionListener(new ActionListener() { |
| public void actionPerformed(final ActionEvent e) { |
| final PackageChooserDialog dialog = new PackageChooserDialog(UIDesignerBundle.message("title.choose.package"), myData.myProject); |
| dialog.selectPackage(myTfWithBtnChoosePackage.getText()); |
| dialog.show(); |
| final PsiPackage aPackage = dialog.getSelectedPackage(); |
| if (aPackage != null) { |
| myTfWithBtnChoosePackage.setText(aPackage.getQualifiedName()); |
| } |
| } |
| }); |
| } |
| |
| public void _init() { |
| // Select way of binding |
| if(myData.myBindToNewBean){ |
| myRbBindToNewBean.setSelected(true); |
| } |
| else{ |
| myRbBindToExistingBean.setSelected(true); |
| } |
| |
| // New bean |
| myTfShortClassName.setText(myData.myShortClassName); |
| myTfWithBtnChoosePackage.setText(myData.myPackageName); |
| |
| // Existing bean |
| myTfWitgBtnChooseClass.setText( |
| myData.myBeanClass != null ? myData.myBeanClass.getQualifiedName() : null |
| ); |
| } |
| |
| private void resetBindings(){ |
| for(int i = myData.myBindings.length - 1; i >= 0; i--){ |
| myData.myBindings[i].myBeanProperty = null; |
| } |
| } |
| |
| public void _commit(boolean finishChosen) throws CommitStepException{ |
| final boolean newBindToNewBean = myRbBindToNewBean.isSelected(); |
| if(myData.myBindToNewBean != newBindToNewBean){ |
| resetBindings(); |
| } |
| |
| myData.myBindToNewBean = newBindToNewBean; |
| |
| if(myData.myBindToNewBean){ // new bean |
| final String oldShortClassName = myData.myShortClassName; |
| final String oldPackageName = myData.myPackageName; |
| |
| final String shortClassName = myTfShortClassName.getText().trim(); |
| if(shortClassName.length() == 0){ |
| throw new CommitStepException(UIDesignerBundle.message("error.please.specify.class.name.of.the.bean.to.be.created")); |
| } |
| final PsiManager psiManager = PsiManager.getInstance(myData.myProject); |
| if(!PsiNameHelper.getInstance(psiManager.getProject()).isIdentifier(shortClassName)){ |
| throw new CommitStepException(UIDesignerBundle.message("error.X.is.not.a.valid.class.name", shortClassName)); |
| } |
| |
| final String packageName = myTfWithBtnChoosePackage.getText().trim(); |
| if(packageName.length() != 0 && JavaPsiFacade.getInstance(psiManager.getProject()).findPackage(packageName) == null){ |
| throw new CommitStepException(UIDesignerBundle.message("error.package.with.name.X.does.not.exist", packageName)); |
| } |
| |
| myData.myShortClassName = shortClassName; |
| myData.myPackageName = packageName; |
| |
| // check whether new class already exists |
| { |
| final String fullClassName = packageName.length() != 0 ? packageName + "." + shortClassName : shortClassName; |
| final Module module = ModuleUtil.findModuleForFile(myData.myFormFile, myData.myProject); |
| if (JavaPsiFacade.getInstance(psiManager.getProject()) |
| .findClass(fullClassName, GlobalSearchScope.moduleWithDependenciesAndLibrariesScope(module)) != null) { |
| throw new CommitStepException(UIDesignerBundle.message("error.cannot.create.class.X.because.it.already.exists", fullClassName)); |
| } |
| } |
| |
| if( |
| !Comparing.equal(oldShortClassName, shortClassName) || |
| !Comparing.equal(oldPackageName, packageName) |
| ){ |
| // After bean class changed we need to reset all previously set bindings |
| resetBindings(); |
| } |
| } |
| else{ // existing bean |
| final String oldFqClassName = myData.myBeanClass != null ? myData.myBeanClass.getQualifiedName() : null; |
| final String newFqClassName = myTfWitgBtnChooseClass.getText().trim(); |
| if(newFqClassName.length() == 0){ |
| throw new CommitStepException(UIDesignerBundle.message("error.please.specify.fully.qualified.name.of.bean.class")); |
| } |
| final PsiClass aClass = |
| JavaPsiFacade.getInstance(myData.myProject).findClass(newFqClassName, GlobalSearchScope.allScope(myData.myProject)); |
| if(aClass == null){ |
| throw new CommitStepException(UIDesignerBundle.message("error.class.with.name.X.does.not.exist", newFqClassName)); |
| } |
| myData.myBeanClass = aClass; |
| |
| if(!Comparing.equal(oldFqClassName, newFqClassName)){ |
| // After bean class changed we need to reset all previously set bindings |
| resetBindings(); |
| } |
| } |
| } |
| |
| public JComponent getComponent() { |
| return myComponent; |
| } |
| } |