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