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