mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
common program parameters: preselect current directory
This commit is contained in:
+25
-29
@@ -21,7 +21,6 @@ import com.intellij.execution.configuration.EnvironmentVariablesComponent;
|
||||
import com.intellij.icons.AllIcons;
|
||||
import com.intellij.openapi.actionSystem.LangDataKeys;
|
||||
import com.intellij.openapi.application.PathMacros;
|
||||
import com.intellij.openapi.fileChooser.FileChooser;
|
||||
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
|
||||
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
|
||||
import com.intellij.openapi.module.Module;
|
||||
@@ -30,21 +29,21 @@ import com.intellij.openapi.ui.FixedSizeButton;
|
||||
import com.intellij.openapi.ui.LabeledComponent;
|
||||
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
|
||||
import com.intellij.openapi.ui.VerticalFlowLayout;
|
||||
import com.intellij.openapi.ui.popup.JBPopup;
|
||||
import com.intellij.openapi.ui.popup.JBPopupFactory;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.ui.MacroAwareTextBrowseFolderListener;
|
||||
import com.intellij.ui.PanelWithAnchor;
|
||||
import com.intellij.ui.RawCommandLineEditor;
|
||||
import com.intellij.ui.components.JBList;
|
||||
import com.intellij.util.ArrayUtil;
|
||||
import com.intellij.util.Consumer;
|
||||
import com.intellij.util.PathUtil;
|
||||
import com.intellij.util.SmartList;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.jps.model.serialization.PathMacroUtil;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class CommonProgramParametersPanel extends JPanel implements PanelWithAnchor {
|
||||
@@ -55,7 +54,6 @@ public class CommonProgramParametersPanel extends JPanel implements PanelWithAnc
|
||||
protected JComponent myAnchor;
|
||||
|
||||
private Module myModuleContext = null;
|
||||
private boolean myHaveModuleContext = false;
|
||||
|
||||
public CommonProgramParametersPanel() {
|
||||
super();
|
||||
@@ -66,29 +64,27 @@ public class CommonProgramParametersPanel extends JPanel implements PanelWithAnc
|
||||
updateUI();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
protected Project getProject() {
|
||||
return myModuleContext != null ? myModuleContext.getProject() : null;
|
||||
}
|
||||
|
||||
protected void initComponents() {
|
||||
myProgramParametersComponent = LabeledComponent.create(new RawCommandLineEditor(),
|
||||
ExecutionBundle.message("run.configuration.program.parameters"));
|
||||
myWorkingDirectoryField = new TextFieldWithBrowseButton(new ActionListener() {
|
||||
|
||||
FileChooserDescriptor fileChooserDescriptor = FileChooserDescriptorFactory.createSingleFolderDescriptor();
|
||||
//noinspection DialogTitleCapitalization
|
||||
fileChooserDescriptor.setTitle(ExecutionBundle.message("select.working.directory.message"));
|
||||
myWorkingDirectoryField = new TextFieldWithBrowseButton();
|
||||
myWorkingDirectoryField.addBrowseFolderListener(new MacroAwareTextBrowseFolderListener(fileChooserDescriptor, getProject()) {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
FileChooserDescriptor fileChooserDescriptor = FileChooserDescriptorFactory.createSingleFolderDescriptor();
|
||||
fileChooserDescriptor.setTitle(ExecutionBundle.message("select.working.directory.message"));
|
||||
fileChooserDescriptor.putUserData(LangDataKeys.MODULE_CONTEXT, myModuleContext);
|
||||
Project project = myModuleContext != null ? myModuleContext.getProject() : null;
|
||||
FileChooser.chooseFile(fileChooserDescriptor, project, myWorkingDirectoryComponent, null, new Consumer<VirtualFile>() {
|
||||
@Override
|
||||
public void consume(VirtualFile file) {
|
||||
setWorkingDirectory(file.getPresentableUrl());
|
||||
}
|
||||
});
|
||||
myFileChooserDescriptor.putUserData(LangDataKeys.MODULE_CONTEXT, myModuleContext);
|
||||
setProject(getProject());
|
||||
super.actionPerformed(e);
|
||||
}
|
||||
}) {
|
||||
@Override
|
||||
protected void installPathCompletion(FileChooserDescriptor fileChooserDescriptor) {
|
||||
super.installPathCompletion(FileChooserDescriptorFactory.createSingleFolderDescriptor());
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
final JPanel panel = new JPanel(new BorderLayout());
|
||||
panel.add(myWorkingDirectoryField, BorderLayout.CENTER);
|
||||
@@ -98,11 +94,13 @@ public class CommonProgramParametersPanel extends JPanel implements PanelWithAnc
|
||||
button.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
final List<String> macros = new ArrayList<String>(PathMacros.getInstance().getUserMacroNames());
|
||||
if (myHaveModuleContext) macros.add("MODULE_DIR");
|
||||
final List<String> macros = new SmartList<String>(PathMacros.getInstance().getUserMacroNames());
|
||||
if (myModuleContext != null) {
|
||||
macros.add(PathMacroUtil.MODULE_DIR_MACRO_NAME);
|
||||
}
|
||||
|
||||
final JList list = new JBList(ArrayUtil.toStringArray(macros));
|
||||
final JBPopup popup = JBPopupFactory.getInstance().createListPopupBuilder(list).setItemChoosenCallback(new Runnable() {
|
||||
JBPopupFactory.getInstance().createListPopupBuilder(list).setItemChoosenCallback(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
final Object value = list.getSelectedValue();
|
||||
@@ -110,8 +108,7 @@ public class CommonProgramParametersPanel extends JPanel implements PanelWithAnc
|
||||
setWorkingDirectory("$" + value + "$");
|
||||
}
|
||||
}
|
||||
}).setMovable(false).setResizable(false).createPopup();
|
||||
popup.showUnderneathOf(button);
|
||||
}).setMovable(false).setResizable(false).createPopup().showUnderneathOf(button);
|
||||
}
|
||||
});
|
||||
panel.add(button, BorderLayout.EAST);
|
||||
@@ -157,7 +154,6 @@ public class CommonProgramParametersPanel extends JPanel implements PanelWithAnc
|
||||
|
||||
public void setModuleContext(Module moduleContext) {
|
||||
myModuleContext = moduleContext;
|
||||
myHaveModuleContext = true;
|
||||
}
|
||||
|
||||
public LabeledComponent<RawCommandLineEditor> getProgramParametersComponent() {
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
package com.intellij.ui;
|
||||
|
||||
import com.intellij.openapi.actionSystem.LangDataKeys;
|
||||
import com.intellij.openapi.components.PathMacroManager;
|
||||
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
|
||||
import com.intellij.openapi.module.Module;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.ui.TextBrowseFolderListener;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public class MacroAwareTextBrowseFolderListener extends TextBrowseFolderListener {
|
||||
public MacroAwareTextBrowseFolderListener(@NotNull FileChooserDescriptor fileChooserDescriptor,
|
||||
@Nullable Project project) {
|
||||
super(fileChooserDescriptor, project);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
protected String expandPath(@NotNull String path) {
|
||||
Project project = getProject();
|
||||
if (project != null) {
|
||||
path = PathMacroManager.getInstance(project).expandPath(path);
|
||||
}
|
||||
|
||||
Module module = myFileChooserDescriptor.getUserData(LangDataKeys.MODULE_CONTEXT);
|
||||
if (module == null) {
|
||||
module = myFileChooserDescriptor.getUserData(LangDataKeys.MODULE);
|
||||
}
|
||||
if (module != null) {
|
||||
path = PathMacroManager.getInstance(module).expandPath(path);
|
||||
}
|
||||
|
||||
return super.expandPath(path);
|
||||
}
|
||||
}
|
||||
@@ -45,7 +45,6 @@ import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.InputEvent;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.util.List;
|
||||
|
||||
public class ComponentWithBrowseButton<Comp extends JComponent> extends JPanel implements Disposable {
|
||||
private final Comp myComponent;
|
||||
@@ -191,7 +190,7 @@ public class ComponentWithBrowseButton<Comp extends JComponent> extends JPanel i
|
||||
private final String myDescription;
|
||||
protected ComponentWithBrowseButton<T> myTextComponent;
|
||||
private final TextComponentAccessor<T> myAccessor;
|
||||
private final Project myProject;
|
||||
private Project myProject;
|
||||
protected final FileChooserDescriptor myFileChooserDescriptor;
|
||||
|
||||
public BrowseFolderActionListener(@Nullable String title, @Nullable String description, ComponentWithBrowseButton<T> textField, @Nullable Project project, FileChooserDescriptor fileChooserDescriptor, TextComponentAccessor<T> accessor) {
|
||||
@@ -203,20 +202,32 @@ public class ComponentWithBrowseButton<Comp extends JComponent> extends JPanel i
|
||||
myAccessor = accessor;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
protected Project getProject() {
|
||||
return myProject;
|
||||
}
|
||||
|
||||
protected void setProject(@Nullable Project project) {
|
||||
myProject = project;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e){
|
||||
FileChooserDescriptor fileChooserDescriptor = (FileChooserDescriptor)myFileChooserDescriptor.clone();
|
||||
if (myTitle != null) {
|
||||
fileChooserDescriptor.setTitle(myTitle);
|
||||
}
|
||||
if (myDescription != null) {
|
||||
fileChooserDescriptor.setDescription(myDescription);
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
FileChooserDescriptor fileChooserDescriptor = myFileChooserDescriptor;
|
||||
if (myTitle != null || myDescription != null) {
|
||||
fileChooserDescriptor = (FileChooserDescriptor)myFileChooserDescriptor.clone();
|
||||
if (myTitle != null) {
|
||||
fileChooserDescriptor.setTitle(myTitle);
|
||||
}
|
||||
if (myDescription != null) {
|
||||
fileChooserDescriptor.setDescription(myDescription);
|
||||
}
|
||||
}
|
||||
|
||||
FileChooser.chooseFiles(fileChooserDescriptor, myProject, getInitialFile(), new Consumer<List<VirtualFile>>() {
|
||||
FileChooser.chooseFile(fileChooserDescriptor, getProject(), getInitialFile(), new Consumer<VirtualFile>() {
|
||||
@Override
|
||||
public void consume(List<VirtualFile> files) {
|
||||
onFileChoosen(files.get(0));
|
||||
public void consume(VirtualFile file) {
|
||||
onFileChoosen(file);
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -229,7 +240,7 @@ public class ComponentWithBrowseButton<Comp extends JComponent> extends JPanel i
|
||||
}
|
||||
|
||||
directoryName = FileUtil.toSystemIndependentName(directoryName);
|
||||
VirtualFile path = LocalFileSystem.getInstance().findFileByPath(directoryName);
|
||||
VirtualFile path = LocalFileSystem.getInstance().findFileByPath(expandPath(directoryName));
|
||||
while (path == null && directoryName.length() > 0) {
|
||||
int pos = directoryName.lastIndexOf('/');
|
||||
if (pos <= 0) break;
|
||||
@@ -239,6 +250,11 @@ public class ComponentWithBrowseButton<Comp extends JComponent> extends JPanel i
|
||||
return path;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
protected String expandPath(@NotNull String path) {
|
||||
return path;
|
||||
}
|
||||
|
||||
protected String getComponentText() {
|
||||
return myAccessor.getText(myTextComponent.getChildComponent()).trim();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user