/* * 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; } }