diff --git a/java.project/src/org/netbeans/modules/java/project/JavaTargetChooserPanel.java b/java.project/src/org/netbeans/modules/java/project/JavaTargetChooserPanel.java --- a/java.project/src/org/netbeans/modules/java/project/JavaTargetChooserPanel.java +++ b/java.project/src/org/netbeans/modules/java/project/JavaTargetChooserPanel.java @@ -379,15 +379,34 @@ return true; } + static String getTypeFromFQN(String name) { + int lastIndexOf = name.lastIndexOf('.'); + final boolean isFQN = (lastIndexOf > 0 && lastIndexOf < name.length()); + if (isFQN) { + return name.substring(lastIndexOf + 1); + } + return null; + } + + static String getPackageFromFQN(String name) { + int lastIndexOf = name.lastIndexOf('.'); + final boolean isFQN = (lastIndexOf > 0 && lastIndexOf < name.length()); + if (isFQN) { + return name.substring(0, lastIndexOf); + } + return null; + } + static boolean isValidTypeIdentifier(String ident) { - if (ident == null || "".equals(ident) || !Utilities.isJavaIdentifier( ident ) ) { - return false; - } - else { - return true; - } + final boolean javaIdentifier = Utilities.isJavaIdentifier(ident); + final boolean javaIdenfifierWithinFQN = isValidTypeIdentifierWithinFQN(ident); + return ident != null && !"".equals(ident) && (javaIdentifier || javaIdenfifierWithinFQN); } - + + static boolean isValidTypeIdentifierWithinFQN(String ident) { + String type = getTypeFromFQN(ident); + return type != null && Utilities.isJavaIdentifier(type); + } // helper methods copied from project/ui/ProjectUtilities /** Checks if the given file name can be created in the target folder. * diff --git a/java.project/src/org/netbeans/modules/java/project/JavaTargetChooserPanelGUI.form b/java.project/src/org/netbeans/modules/java/project/JavaTargetChooserPanelGUI.form --- a/java.project/src/org/netbeans/modules/java/project/JavaTargetChooserPanelGUI.form +++ b/java.project/src/org/netbeans/modules/java/project/JavaTargetChooserPanelGUI.form @@ -1,4 +1,4 @@ - +
diff --git a/java.project/src/org/netbeans/modules/java/project/JavaTargetChooserPanelGUI.java b/java.project/src/org/netbeans/modules/java/project/JavaTargetChooserPanelGUI.java --- a/java.project/src/org/netbeans/modules/java/project/JavaTargetChooserPanelGUI.java +++ b/java.project/src/org/netbeans/modules/java/project/JavaTargetChooserPanelGUI.java @@ -60,6 +60,7 @@ import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.DocumentListener; +import javax.swing.text.Document; import org.netbeans.api.project.Project; import org.netbeans.api.project.ProjectUtils; import org.netbeans.api.project.SourceGroup; @@ -72,6 +73,8 @@ import org.openide.loaders.DataObjectNotFoundException; import org.openide.util.NbBundle; import org.openide.util.RequestProcessor; +import static org.netbeans.modules.java.project.JavaTargetChooserPanel.getPackageFromFQN; +import static org.netbeans.modules.java.project.JavaTargetChooserPanel.getTypeFromFQN; /** * Permits user to select a package to place a Java class (or other resource) into. @@ -267,7 +270,13 @@ } public String getTargetName() { - String text = documentNameTextField.getText().trim(); + String text; + String nameFromFQN = getTypeFromFQN(documentNameTextField.getText().trim()); + if (null != nameFromFQN) { + text = nameFromFQN; + } else { + text = documentNameTextField.getText().trim(); + } if ( text.length() == 0 ) { return null; @@ -525,6 +534,8 @@ }); } + private boolean wasPreviouslyFQN = false; + private String originalPackageName; private void updateText() { final Object selectedItem = rootComboBox.getSelectedItem(); String createdFileName; @@ -533,12 +544,34 @@ FileObject rootFolder = g.getRootFolder(); String packageName = getPackageFileName(); String documentName = documentNameTextField.getText().trim(); + if (Type.FILE.equals(type)) { + final boolean isFQN = null != getTypeFromFQN(documentName); + if (isFQN) { + if (!wasPreviouslyFQN) { + //backup the original package name + originalPackageName = getPackageName(); + } + //set the textfield from the parsed FQN text + packageName = getPackageFromFQN(documentName); + documentName = getTypeFromFQN(documentName); + setPackageFieldWithoutNotifyingListeners(null != packageName ? packageName : ""); + wasPreviouslyFQN = true; + } else { + if (wasPreviouslyFQN) { + //reset the package name, if the user reverts his previously entered FQN + setPackageFieldWithoutNotifyingListeners(originalPackageName); + wasPreviouslyFQN = false; + } + } + packageComboBox.setEnabled(!isFQN); + } if (type == Type.PACKAGE) { documentName = documentName.replace( '.', '/' ); // NOI18N } else if ( documentName.length() > 0 ) { documentName = documentName + expectedExtension; } + packageName = packageName.replace('.', '/'); createdFileName = FileUtil.getFileDisplayName( rootFolder ) + ( packageName.startsWith("/") || packageName.startsWith( File.separator ) ? "" : "/" ) + // NOI18N packageName + @@ -596,6 +629,16 @@ return name; } } + + void setPackageFieldWithoutNotifyingListeners(final String text) { + Component packageEditor = packageComboBox.getEditor().getEditorComponent(); + if (packageEditor instanceof javax.swing.JTextField) { + Document document = ((javax.swing.JTextField) packageEditor).getDocument(); + document.removeDocumentListener(this); + ((javax.swing.JTextField) packageEditor).setText(text); + document.addDocumentListener(this); + } + } // Private innerclasses ----------------------------------------------------