blob: 848c574d8be3f594e8036b0191d41392a4b64c0f [file] [log] [blame]
/*
* Copyright 2000-2012 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.ui;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.fileChooser.FileChooser;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.application.ApplicationManager;
import javax.swing.*;
import javax.swing.text.JTextComponent;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseListener;
import java.io.File;
public class InsertPathAction extends AnAction {
private static final Logger LOG = Logger.getInstance("#com.intellij.ui.InsertPathAction");
protected final JTextComponent myTextField;
protected static final CustomShortcutSet CTRL_F = new CustomShortcutSet(KeyStroke.getKeyStroke(KeyEvent.VK_F, InputEvent.CTRL_DOWN_MASK));
protected final FileChooserDescriptor myDescriptor;
private MouseListener myPopupHandler;
protected static final Key INSERT_PATH_ACTION= Key.create("insertPathAction");
private InsertPathAction(JTextComponent textField) {
this(textField, FileChooserDescriptorFactory.createSingleLocalFileDescriptor());
}
private InsertPathAction(JTextComponent textField, FileChooserDescriptor descriptor) {
super(UIBundle.message("insert.file.path.to.text.action.name"));
myTextField = textField;
registerCustomShortcutSet(CTRL_F, myTextField);
myDescriptor = descriptor;
}
public void actionPerformed(AnActionEvent e) {
String selectedText = myTextField.getSelectedText();
VirtualFile virtualFile;
if (selectedText != null ) {
virtualFile = LocalFileSystem.getInstance().findFileByPath(selectedText.replace(File.separatorChar, '/'));
}
else {
virtualFile = null;
}
//TODO use from openapi
//FeatureUsageTracker.getInstance().triggerFeatureUsed("ui.commandLine.insertPath");
VirtualFile[] files = FileChooser.chooseFiles(myDescriptor, myTextField, getEventProject(e), virtualFile);
if (files.length != 0) {
myTextField.replaceSelection(files[0].getPresentableUrl());
}
}
private void uninstall() {
uninstallPopupHandler();
myTextField.putClientProperty(INSERT_PATH_ACTION, null);
}
private void savePopupHandler(MouseListener popupHandler) {
if (myPopupHandler != null) {
LOG.error("Installed twice");
uninstallPopupHandler();
}
myPopupHandler = popupHandler;
}
private void uninstallPopupHandler() {
if (myPopupHandler == null) return;
myTextField.removeMouseListener(myPopupHandler);
myPopupHandler = null;
}
public static void addTo(JTextComponent textField) {
addTo(textField, null);
}
public static void addTo(JTextComponent textField, FileChooserDescriptor descriptor) {
if (ApplicationManager.getApplication() != null) { //NPE fixed when another class loader works
removeFrom(textField);
if (textField.getClientProperty(INSERT_PATH_ACTION) != null) return;
DefaultActionGroup actionGroup = new DefaultActionGroup();
InsertPathAction action = descriptor != null? new InsertPathAction(textField, descriptor) : new InsertPathAction(textField);
actionGroup.add(action);
MouseListener popupHandler = PopupHandler.installUnknownPopupHandler(textField, actionGroup, ActionManager.getInstance());
action.savePopupHandler(popupHandler);
textField.putClientProperty(INSERT_PATH_ACTION, action);
}
}
public static void removeFrom(JTextComponent textComponent) {
InsertPathAction action = getFrom(textComponent);
if (action == null) return;
action.uninstall();
}
public static void copyFromTo(JTextComponent original, JTextComponent target) {
InsertPathAction action = getFrom(original);
if (action == null) return;
removeFrom(target);
addTo(target, action.myDescriptor);
}
private static InsertPathAction getFrom(JTextComponent textComponent) {
Object property = textComponent.getClientProperty(INSERT_PATH_ACTION);
if (!(property instanceof InsertPathAction)) return null;
return (InsertPathAction)property;
}
}