From e6eb6d0e20d6d01aae63af20be06bf81e7e57053 Mon Sep 17 00:00:00 2001 From: "Rustam.Vishnyakov" Date: Thu, 16 Dec 2010 11:53:59 +0300 Subject: [PATCH] JS library documentation provider UI for standalone products (WebStorm, etc.) [r=K.Safonov] --- .../ui/EditLibraryDialog.form | 77 ++++++++++-- .../ui/EditLibraryDialog.java | 113 ++++++++++++++++++ .../ui/ScriptingLibrariesPanel.java | 6 +- .../src/messages/IdeBundle.properties | 5 + 4 files changed, 191 insertions(+), 10 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/scriptingContext/ui/EditLibraryDialog.form b/platform/lang-impl/src/com/intellij/ide/scriptingContext/ui/EditLibraryDialog.form index e58c238c7c25..e6ca688989ca 100644 --- a/platform/lang-impl/src/com/intellij/ide/scriptingContext/ui/EditLibraryDialog.form +++ b/platform/lang-impl/src/com/intellij/ide/scriptingContext/ui/EditLibraryDialog.form @@ -1,9 +1,9 @@
- - + + - + @@ -29,18 +29,19 @@ - + + - + - + @@ -52,7 +53,7 @@ - + @@ -72,7 +73,7 @@ - + @@ -83,6 +84,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/platform/lang-impl/src/com/intellij/ide/scriptingContext/ui/EditLibraryDialog.java b/platform/lang-impl/src/com/intellij/ide/scriptingContext/ui/EditLibraryDialog.java index 182a0561cc31..32cc32ee5981 100644 --- a/platform/lang-impl/src/com/intellij/ide/scriptingContext/ui/EditLibraryDialog.java +++ b/platform/lang-impl/src/com/intellij/ide/scriptingContext/ui/EditLibraryDialog.java @@ -20,16 +20,21 @@ import com.intellij.ide.scriptingContext.LangScriptingContextProvider; import com.intellij.openapi.fileChooser.FileChooser; import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.project.Project; +import com.intellij.openapi.projectRoots.ui.Util; import com.intellij.openapi.roots.OrderRootType; import com.intellij.openapi.roots.libraries.scripting.ScriptingLibraryTable; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.ui.components.JBList; import com.intellij.ui.table.JBTable; +import com.intellij.util.ArrayUtil; import com.intellij.util.containers.HashSet; import org.jetbrains.annotations.Nullable; import javax.swing.*; +import javax.swing.event.ListDataEvent; +import javax.swing.event.ListDataListener; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.AbstractTableModel; @@ -52,10 +57,14 @@ public class EditLibraryDialog extends DialogWrapper { private JButton myAddFileButton; private JButton myRemoveFileButton; private JBTable myFileTable; + private JButton myAddDocUrlButton; + private JButton myRemoveDocUrlButton; + private JBList myDocUrlList; private Project myProject; private FileTableModel myFileTableModel; private VirtualFile mySelectedFile; private LangScriptingContextProvider myProvider; + private MyDocUrlListModel myDocUrlListModel; public EditLibraryDialog(String title, LangScriptingContextProvider provider, Project project) { super(true); @@ -87,6 +96,44 @@ public class EditLibraryDialog extends DialogWrapper { updateSelection(); } }); + + myDocUrlListModel = new MyDocUrlListModel(); + myDocUrlList.setModel(myDocUrlListModel); + myDocUrlListModel.addListDataListener(new ListDataListener() { + @Override + public void intervalAdded(ListDataEvent e) { + myRemoveDocUrlButton.setEnabled(true); + } + + @Override + public void intervalRemoved(ListDataEvent e) { + Object source = e.getSource(); + if (source instanceof MyDocUrlListModel && ((MyDocUrlListModel)source).getDocUrls().length == 0) { + myRemoveDocUrlButton.setEnabled(false); + } + } + + @Override + public void contentsChanged(ListDataEvent e) { + // do nothing + } + }); + + myAddDocUrlButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + specifyDocUrl(); + } + }); + + myRemoveDocUrlButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + removeDocUrl(); + } + }); + myRemoveDocUrlButton.setEnabled(false); + init(); TableColumn typeCol = myFileTable.getColumnModel().getColumn(FILE_TYPE_COL); @@ -99,6 +146,11 @@ public class EditLibraryDialog extends DialogWrapper { this(title, provider, project); myLibName.setText(lib.getName()); myFileTableModel.setFiles(lib.getSourceFiles(), lib.getCompactFiles()); + String[] docUrls = lib.getDocUrls(); + myDocUrlListModel.setDocUrls(docUrls); + if (docUrls.length > 0) { + myRemoveDocUrlButton.setEnabled(true); + } } private class MyTableCellEditor extends DefaultCellEditor { @@ -311,6 +363,10 @@ public class EditLibraryDialog extends DialogWrapper { public VirtualFile[] getCompactFiles() { return myFileTableModel.getCompactFiles(); } + + public String[] getDocUrls() { + return myDocUrlListModel.getDocUrls(); + } @Override protected void doOKAction() { @@ -324,4 +380,61 @@ public class EditLibraryDialog extends DialogWrapper { private static boolean isLibNameValid(String libName) { return libName != null && libName.matches("\\w[\\w\\d\\._\\-\\d]*"); } + + private static class MyDocUrlListModel extends AbstractListModel { + + private ArrayList myDocUrls = new ArrayList(); + + public void setDocUrls(String[] urls) { + if (urls != null && urls.length > 0) { + myDocUrls.addAll(Arrays.asList(urls)); + } + } + + @Override + public int getSize() { + return myDocUrls.size(); + } + + @Override + public Object getElementAt(int index) { + return myDocUrls.get(index); + } + + public int addUrl(String url) { + myDocUrls.add(url); + int newIndex = myDocUrls.indexOf(url); + fireIntervalAdded(this, newIndex, newIndex); + return newIndex; + } + + public int indexOf(String url) { + return myDocUrls.indexOf(url); + } + + public void remove(String url) { + if (url == null || !myDocUrls.contains(url)) return; + int index = myDocUrls.indexOf(url); + myDocUrls.remove(url); + fireIntervalRemoved(this, index, index); + } + + public String[] getDocUrls() { + return ArrayUtil.toStringArray(myDocUrls); + } + } + + private void specifyDocUrl() { + VirtualFile vf = Util.showSpecifyJavadocUrlDialog(contentPane); + if (vf != null && vf.isValid()) { + String url = vf.getUrl(); + int index = myDocUrlListModel.addUrl(url); + myDocUrlList.ensureIndexIsVisible(index); + myDocUrlList.setSelectedIndex(index); + } + } + + private void removeDocUrl() { + myDocUrlListModel.remove((String)myDocUrlList.getSelectedValue()); + } } diff --git a/platform/lang-impl/src/com/intellij/ide/scriptingContext/ui/ScriptingLibrariesPanel.java b/platform/lang-impl/src/com/intellij/ide/scriptingContext/ui/ScriptingLibrariesPanel.java index 603dd4088551..b41ea3e2ff23 100644 --- a/platform/lang-impl/src/com/intellij/ide/scriptingContext/ui/ScriptingLibrariesPanel.java +++ b/platform/lang-impl/src/com/intellij/ide/scriptingContext/ui/ScriptingLibrariesPanel.java @@ -96,7 +96,8 @@ public class ScriptingLibrariesPanel extends ScriptingLibrariesPanelStub { EditLibraryDialog editLibDialog = new EditLibraryDialog("New Library", myProvider, myProject); editLibDialog.show(); if (editLibDialog.isOK()) { - myLibTableModel.createLibrary(editLibDialog.getLibName(), editLibDialog.getSourceFiles(), editLibDialog.getCompactFiles(), null); + myLibTableModel.createLibrary(editLibDialog.getLibName(), editLibDialog.getSourceFiles(), editLibDialog.getCompactFiles(), + editLibDialog.getDocUrls()); } } @@ -129,7 +130,8 @@ public class ScriptingLibrariesPanel extends ScriptingLibrariesPanelStub { editLibDialog.show(); if (editLibDialog.isOK()) { myLibTableModel - .updateLibrary(libName, editLibDialog.getLibName(), editLibDialog.getSourceFiles(), editLibDialog.getCompactFiles(), null); + .updateLibrary(libName, editLibDialog.getLibName(), editLibDialog.getSourceFiles(), editLibDialog.getCompactFiles(), + editLibDialog.getDocUrls()); } } } diff --git a/platform/platform-resources-en/src/messages/IdeBundle.properties b/platform/platform-resources-en/src/messages/IdeBundle.properties index 97b83f71b0d1..b32905628a95 100644 --- a/platform/platform-resources-en/src/messages/IdeBundle.properties +++ b/platform/platform-resources-en/src/messages/IdeBundle.properties @@ -1081,6 +1081,8 @@ goto.inspection.action.text=&Run Inspection by Name... label.no.inspections.found=No inspections found #Scripting library management +scripting.lib.name=&Name +scripting.lib.file.title=Files scripting.lib.file.location=Location scripting.lib.file.type=Type scripting.lib.select.root=Select library file or directory @@ -1090,6 +1092,9 @@ scripting.lib.detach=&Detach scripting.lib.add=&Add... scripting.lib.edit=&Edit... scripting.lib.remove=&Remove +scripting.lib.docUrl.specify=&Specify... +scripting.lib.docUrl.remove=&Remove +scripting.lib.docUrl.title=Documentation URLs scripting.lib.usageScope=Usage Scope scripting.lib.usageScope.caption=Specify which libraries are used in specific files and/or directories. scripting.lib.usageScope.tableTitle=Library