JS library documentation provider UI for standalone products (WebStorm, etc.) [r=K.Safonov]

This commit is contained in:
Rustam.Vishnyakov
2010-12-16 12:10:30 +03:00
parent a01c7c75c7
commit e6eb6d0e20
4 changed files with 191 additions and 10 deletions
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.intellij.ide.scriptingContext.ui.EditLibraryDialog">
<grid id="cbd77" binding="contentPane" layout-manager="GridLayoutManager" row-count="2" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="10" left="10" bottom="10" right="10"/>
<grid id="cbd77" binding="contentPane" layout-manager="GridLayoutManager" row-count="3" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<xy x="48" y="54" width="775" height="297"/>
<xy x="48" y="54" width="946" height="381"/>
</constraints>
<properties/>
<border type="none"/>
@@ -29,18 +29,19 @@
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="Name:"/>
<labelFor value="c2bfa"/>
<text resource-bundle="messages/IdeBundle" key="scripting.lib.name"/>
</properties>
</component>
</children>
</grid>
<grid id="e01b6" layout-manager="GridLayoutManager" row-count="5" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<grid id="e01b6" layout-manager="GridLayoutManager" row-count="4" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<grid row="1" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="2" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
<border type="none" title="Files:"/>
<border type="none" title-resource-bundle="messages/IdeBundle" title-key="scripting.lib.file.title"/>
<children>
<component id="98c78" class="javax.swing.JButton" binding="myAddFileButton">
<constraints>
@@ -52,7 +53,7 @@
</component>
<scrollpane id="2fb19" class="com.intellij.ui.components.JBScrollPane">
<constraints>
<grid row="0" column="0" row-span="4" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false">
<grid row="0" column="0" row-span="3" col-span="1" vsize-policy="3" hsize-policy="7" anchor="0" fill="3" indent="0" use-parent-layout="false">
<minimum-size width="600" height="-1"/>
<preferred-size width="-1" height="200"/>
</grid>
@@ -72,7 +73,7 @@
</scrollpane>
<vspacer id="36d74">
<constraints>
<grid row="3" column="1" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
<grid row="2" column="1" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
</constraints>
</vspacer>
<component id="1dade" class="javax.swing.JButton" binding="myRemoveFileButton">
@@ -83,6 +84,66 @@
<text resource-bundle="messages/IdeBundle" key="scripting.lib.detach"/>
</properties>
</component>
<hspacer id="c4815">
<constraints>
<grid row="3" column="0" row-span="1" col-span="1" vsize-policy="1" hsize-policy="6" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
</hspacer>
</children>
</grid>
<grid id="2a02c" layout-manager="GridLayoutManager" row-count="4" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<grid row="2" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
<border type="none" title-resource-bundle="messages/IdeBundle" title-key="scripting.lib.docUrl.title"/>
<children>
<component id="fad1f" class="javax.swing.JButton" binding="myAddDocUrlButton">
<constraints>
<grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text resource-bundle="messages/IdeBundle" key="scripting.lib.docUrl.specify"/>
</properties>
</component>
<component id="2c3dd" class="javax.swing.JButton" binding="myRemoveDocUrlButton">
<constraints>
<grid row="1" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text resource-bundle="messages/IdeBundle" key="scripting.lib.docUrl.remove"/>
</properties>
</component>
<scrollpane id="2e869" class="com.intellij.ui.components.JBScrollPane">
<constraints>
<grid row="0" column="0" row-span="3" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false">
<minimum-size width="600" height="-1"/>
</grid>
</constraints>
<properties>
<horizontalScrollBarPolicy value="31"/>
</properties>
<border type="none"/>
<children>
<component id="3d6e4" class="com.intellij.ui.components.JBList" binding="myDocUrlList">
<constraints/>
<properties>
<selectionMode value="0"/>
</properties>
</component>
</children>
</scrollpane>
<vspacer id="6b5fa">
<constraints>
<grid row="2" column="1" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
</constraints>
</vspacer>
<hspacer id="128aa">
<constraints>
<grid row="3" column="0" row-span="1" col-span="1" vsize-policy="1" hsize-policy="6" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
</hspacer>
</children>
</grid>
</children>
@@ -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<String> myDocUrls = new ArrayList<String>();
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());
}
}
@@ -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());
}
}
}
@@ -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