4b19b58049a488ee1506ff6a79a79c695d3892d3
[idea/community.git] / java / idea-ui / src / com / intellij / openapi / roots / ui / configuration / JavadocEditor.java
1 /*
2  * Copyright 2000-2012 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.openapi.roots.ui.configuration;
17
18 import com.intellij.CommonBundle;
19 import com.intellij.ide.JavaUiBundle;
20 import com.intellij.openapi.actionSystem.AnActionEvent;
21 import com.intellij.openapi.fileChooser.FileChooser;
22 import com.intellij.openapi.fileChooser.FileChooserDescriptor;
23 import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
24 import com.intellij.openapi.project.Project;
25 import com.intellij.openapi.projectRoots.ui.Util;
26 import com.intellij.openapi.roots.JavaModuleExternalPaths;
27 import com.intellij.openapi.util.NlsContexts;
28 import com.intellij.openapi.vfs.VirtualFile;
29 import com.intellij.ui.*;
30 import com.intellij.ui.components.JBLabel;
31 import com.intellij.ui.table.JBTable;
32 import com.intellij.util.ArrayUtil;
33 import com.intellij.util.IconUtil;
34 import com.intellij.util.ui.ItemRemovable;
35 import com.intellij.util.ui.UIUtil;
36 import org.jetbrains.annotations.NotNull;
37
38 import javax.swing.*;
39 import javax.swing.border.Border;
40 import javax.swing.table.DefaultTableModel;
41 import java.awt.*;
42 import java.util.List;
43
44 /**
45  * @author Eugene Zhuravlev
46  */
47 public class JavadocEditor extends ModuleElementsEditor {
48   private JTable myTable;
49
50   public JavadocEditor(ModuleConfigurationState state) {
51     super(state);
52   }
53
54   @Override
55   public String getHelpTopic() {
56     return "projectStructure.modules.paths";
57   }
58
59   @Override
60   @NlsContexts.ConfigurableName
61   public String getDisplayName() {
62     return getName();
63   }
64
65   @Override
66   public void saveData() {
67     TableUtil.stopEditing(myTable);
68     final int count = myTable.getRowCount();
69     String[] urls = ArrayUtil.newStringArray(count);
70     for (int row = 0; row < count; row++) {
71       final TableItem item = ((MyTableModel)myTable.getModel()).getTableItemAt(row);
72       urls[row] = item.getUrl();
73     }
74     getModel().getModuleExtension(JavaModuleExternalPaths.class).setJavadocUrls(urls);
75     fireConfigurationChanged();
76   }
77
78   @Override
79   public JComponent createComponentImpl() {
80     final DefaultTableModel tableModel = createModel();
81     myTable = new JBTable(tableModel);
82     myTable.setIntercellSpacing(new Dimension(0, 0));
83     myTable.setDefaultRenderer(TableItem.class, new MyRenderer());
84     myTable.setShowGrid(false);
85     myTable.setDragEnabled(false);
86     myTable.setShowHorizontalLines(false);
87     myTable.setShowVerticalLines(false);
88     myTable.getSelectionModel().setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
89
90     JPanel tablePanel = ToolbarDecorator.createDecorator(myTable)
91       .setAddAction(new AnActionButtonRunnable() {
92         @Override
93         public void run(AnActionButton button) {
94           FileChooserDescriptor myDescriptor = FileChooserDescriptorFactory.createMultipleJavaPathDescriptor();
95           myDescriptor.setTitle(JavaUiBundle.message("module.javadoc.add.path.title"));
96           myDescriptor.setDescription(JavaUiBundle.message("module.javadoc.add.path.prompt"));
97           VirtualFile[] files = FileChooser.chooseFiles(myDescriptor, myTable, getProject(), null);
98           final MyTableModel tableModel = (MyTableModel)myTable.getModel();
99           boolean changes = false;
100           for (final VirtualFile file : files) {
101             if (file != null) {
102               tableModel.addTableItem(new TableItem(file));
103               changes = true;
104             }
105           }
106           if (changes) {
107             saveData();
108             TableUtil.selectRows(myTable, new int[]{tableModel.getRowCount() - 1});
109           }
110         }
111       }).addExtraAction(new DumbAwareActionButton(JavaUiBundle.messagePointer("module.javadoc.add.url.button"), IconUtil.getAddLinkIcon()) {
112         @Override
113         public void actionPerformed(@NotNull AnActionEvent e) {
114           VirtualFile[] files = new VirtualFile[]{Util.showSpecifyJavadocUrlDialog(myTable)};
115           final MyTableModel tableModel = (MyTableModel)myTable.getModel();
116           boolean changes = false;
117           for (final VirtualFile file : files) {
118             if (file != null) {
119               tableModel.addTableItem(new TableItem(file));
120               changes = true;
121             }
122           }
123           if (changes) {
124             saveData();
125             TableUtil.selectRows(myTable, new int[]{tableModel.getRowCount() - 1});
126           }
127         }
128       }).setRemoveAction(new AnActionButtonRunnable() {
129         @Override
130         public void run(AnActionButton button) {
131           final List<Object[]> removedItems = TableUtil.removeSelectedItems(myTable);
132           if (removedItems.size() > 0) {
133             saveData();
134           }
135         }
136       }).setButtonComparator(CommonBundle.message("button.add"), JavaUiBundle.message("module.javadoc.add.url.button"),
137                              CommonBundle.message("button.remove")).createPanel();
138
139     final JPanel mainPanel = new JPanel(new BorderLayout());
140     mainPanel.add(tablePanel, BorderLayout.CENTER);
141     mainPanel.add(
142       new JBLabel(JavaUiBundle.message("project.roots.javadoc.tab.description"), UIUtil.ComponentStyle.SMALL, UIUtil.FontColor.BRIGHTER),
143       BorderLayout.NORTH);
144     return mainPanel;
145   }
146
147   @NotNull
148   private Project getProject() {
149     return myProject;
150   }
151
152   protected DefaultTableModel createModel() {
153     final MyTableModel tableModel = new MyTableModel();
154     final String[] javadocUrls = getModel().getModuleExtension(JavaModuleExternalPaths.class).getJavadocUrls();
155     for (String javadocUrl : javadocUrls) {
156       tableModel.addTableItem(new TableItem(javadocUrl));
157     }
158     return tableModel;
159   }
160
161   @Override
162   public void moduleStateChanged() {
163     if (myTable != null) {
164       final DefaultTableModel tableModel = createModel();
165       myTable.setModel(tableModel);
166     }
167   }
168
169   private static class MyRenderer extends ColoredTableCellRenderer {
170     private static final Border NO_FOCUS_BORDER = BorderFactory.createEmptyBorder(1, 1, 1, 1);
171
172     @Override
173     protected void customizeCellRenderer(@NotNull JTable table, Object value, boolean selected, boolean hasFocus, int row, int column) {
174       setPaintFocusBorder(false);
175       setFocusBorderAroundIcon(true);
176       setBorder(NO_FOCUS_BORDER);
177
178       final TableItem tableItem = ((TableItem)value);
179       if (tableItem != null) {
180         tableItem.getCellAppearance().customize(this);
181       }
182     }
183   }
184
185   private static class MyTableModel extends DefaultTableModel implements ItemRemovable {
186     @Override
187     public String getColumnName(int column) {
188       return null;
189     }
190
191     @Override
192     public Class<TableItem> getColumnClass(int columnIndex) {
193       return TableItem.class;
194     }
195
196     @Override
197     public int getColumnCount() {
198       return 1;
199     }
200
201     @Override
202     public boolean isCellEditable(int row, int column) {
203       return false;
204     }
205
206     public TableItem getTableItemAt(int row) {
207       return (TableItem)getValueAt(row, 0);
208     }
209
210     public void addTableItem(TableItem item) {
211       addRow(new Object[]{item});
212     }
213   }
214
215   private static @NlsContexts.ConfigurableName String getName() {
216     return JavaUiBundle.message("module.javadoc.title");
217   }
218 }