25292aa886a4e911929ae5940b7a4886fa1490af
[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.ide.JavaUiBundle;
19 import com.intellij.openapi.actionSystem.AnActionEvent;
20 import com.intellij.openapi.fileChooser.FileChooser;
21 import com.intellij.openapi.fileChooser.FileChooserDescriptor;
22 import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
23 import com.intellij.openapi.project.Project;
24 import com.intellij.openapi.projectRoots.ui.Util;
25 import com.intellij.openapi.roots.JavaModuleExternalPaths;
26 import com.intellij.openapi.vfs.VirtualFile;
27 import com.intellij.ui.*;
28 import com.intellij.ui.components.JBLabel;
29 import com.intellij.ui.table.JBTable;
30 import com.intellij.util.ArrayUtil;
31 import com.intellij.util.IconUtil;
32 import com.intellij.util.ui.ItemRemovable;
33 import com.intellij.util.ui.UIUtil;
34 import org.jetbrains.annotations.NotNull;
35
36 import javax.swing.*;
37 import javax.swing.border.Border;
38 import javax.swing.table.DefaultTableModel;
39 import java.awt.*;
40 import java.util.List;
41
42 /**
43  * @author Eugene Zhuravlev
44  */
45 public class JavadocEditor extends ModuleElementsEditor {
46   private JTable myTable;
47
48   public JavadocEditor(ModuleConfigurationState state) {
49     super(state);
50   }
51
52   @Override
53   public String getHelpTopic() {
54     return "projectStructure.modules.paths";
55   }
56
57   @Override
58   public String getDisplayName() {
59     return getName();
60   }
61
62   @Override
63   public void saveData() {
64     TableUtil.stopEditing(myTable);
65     final int count = myTable.getRowCount();
66     String[] urls = ArrayUtil.newStringArray(count);
67     for (int row = 0; row < count; row++) {
68       final TableItem item = ((MyTableModel)myTable.getModel()).getTableItemAt(row);
69       urls[row] = item.getUrl();
70     }
71     getModel().getModuleExtension(JavaModuleExternalPaths.class).setJavadocUrls(urls);
72     fireConfigurationChanged();
73   }
74
75   @Override
76   public JComponent createComponentImpl() {
77     final DefaultTableModel tableModel = createModel();
78     myTable = new JBTable(tableModel);
79     myTable.setIntercellSpacing(new Dimension(0, 0));
80     myTable.setDefaultRenderer(TableItem.class, new MyRenderer());
81     myTable.setShowGrid(false);
82     myTable.setDragEnabled(false);
83     myTable.setShowHorizontalLines(false);
84     myTable.setShowVerticalLines(false);
85     myTable.getSelectionModel().setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
86
87     JPanel tablePanel = ToolbarDecorator.createDecorator(myTable)
88       .setAddAction(new AnActionButtonRunnable() {
89         @Override
90         public void run(AnActionButton button) {
91           FileChooserDescriptor myDescriptor = FileChooserDescriptorFactory.createMultipleJavaPathDescriptor();
92           myDescriptor.setTitle(JavaUiBundle.message("module.javadoc.add.path.title"));
93           myDescriptor.setDescription(JavaUiBundle.message("module.javadoc.add.path.prompt"));
94           VirtualFile[] files = FileChooser.chooseFiles(myDescriptor, myTable, getProject(), null);
95           final MyTableModel tableModel = (MyTableModel)myTable.getModel();
96           boolean changes = false;
97           for (final VirtualFile file : files) {
98             if (file != null) {
99               tableModel.addTableItem(new TableItem(file));
100               changes = true;
101             }
102           }
103           if (changes) {
104             saveData();
105             TableUtil.selectRows(myTable, new int[]{tableModel.getRowCount() - 1});
106           }
107         }
108       }).addExtraAction(new DumbAwareActionButton(JavaUiBundle.messagePointer("module.javadoc.add.url.button"), IconUtil.getAddLinkIcon()) {
109         @Override
110         public void actionPerformed(@NotNull AnActionEvent e) {
111           VirtualFile[] files = new VirtualFile[]{Util.showSpecifyJavadocUrlDialog(myTable)};
112           final MyTableModel tableModel = (MyTableModel)myTable.getModel();
113           boolean changes = false;
114           for (final VirtualFile file : files) {
115             if (file != null) {
116               tableModel.addTableItem(new TableItem(file));
117               changes = true;
118             }
119           }
120           if (changes) {
121             saveData();
122             TableUtil.selectRows(myTable, new int[]{tableModel.getRowCount() - 1});
123           }
124         }
125       }).setRemoveAction(new AnActionButtonRunnable() {
126         @Override
127         public void run(AnActionButton button) {
128           final List removedItems = TableUtil.removeSelectedItems(myTable);
129           if (removedItems.size() > 0) {
130             saveData();
131           }
132         }
133       }).setButtonComparator("Add", JavaUiBundle.message("module.javadoc.add.url.button"), "Remove").createPanel();
134
135     final JPanel mainPanel = new JPanel(new BorderLayout());
136     mainPanel.add(tablePanel, BorderLayout.CENTER);
137     mainPanel.add(
138       new JBLabel(JavaUiBundle.message("project.roots.javadoc.tab.description"), UIUtil.ComponentStyle.SMALL, UIUtil.FontColor.BRIGHTER),
139       BorderLayout.NORTH);
140     return mainPanel;
141   }
142
143   @NotNull
144   private Project getProject() {
145     return myProject;
146   }
147
148   protected DefaultTableModel createModel() {
149     final MyTableModel tableModel = new MyTableModel();
150     final String[] javadocUrls = getModel().getModuleExtension(JavaModuleExternalPaths.class).getJavadocUrls();
151     for (String javadocUrl : javadocUrls) {
152       tableModel.addTableItem(new TableItem(javadocUrl));
153     }
154     return tableModel;
155   }
156
157   @Override
158   public void moduleStateChanged() {
159     if (myTable != null) {
160       final DefaultTableModel tableModel = createModel();
161       myTable.setModel(tableModel);
162     }
163   }
164
165   private static class MyRenderer extends ColoredTableCellRenderer {
166     private static final Border NO_FOCUS_BORDER = BorderFactory.createEmptyBorder(1, 1, 1, 1);
167
168     @Override
169     protected void customizeCellRenderer(@NotNull JTable table, Object value, boolean selected, boolean hasFocus, int row, int column) {
170       setPaintFocusBorder(false);
171       setFocusBorderAroundIcon(true);
172       setBorder(NO_FOCUS_BORDER);
173
174       final TableItem tableItem = ((TableItem)value);
175       if (tableItem != null) {
176         tableItem.getCellAppearance().customize(this);
177       }
178     }
179   }
180
181   private static class MyTableModel extends DefaultTableModel implements ItemRemovable {
182     @Override
183     public String getColumnName(int column) {
184       return null;
185     }
186
187     @Override
188     public Class getColumnClass(int columnIndex) {
189       return TableItem.class;
190     }
191
192     @Override
193     public int getColumnCount() {
194       return 1;
195     }
196
197     @Override
198     public boolean isCellEditable(int row, int column) {
199       return false;
200     }
201
202     public TableItem getTableItemAt(int row) {
203       return (TableItem)getValueAt(row, 0);
204     }
205
206     public void addTableItem(TableItem item) {
207       addRow(new Object[]{item});
208     }
209   }
210
211   private static String getName() {
212     return JavaUiBundle.message("module.javadoc.title");
213   }
214 }