IDEA-83795 File types panel: inconsistent UI

This commit is contained in:
Evgeny Zakrevsky
2012-04-11 20:41:12 +04:00
parent 459c30214b
commit f0709a8d43
6 changed files with 134 additions and 212 deletions
@@ -211,6 +211,14 @@ public class IconUtil {
return getToolbarDecoratorIcon("addClass.png");
}
public static Icon getImportIcon() {
return IconLoader.getIcon("/toolbarDecorator/import.png");
}
public static Icon getExportIcon() {
return IconLoader.getIcon("/toolbarDecorator/export.png");
}
public static Icon getToolbarDecoratorIcon(String name) {
return IconLoader.getIcon(getToolbarDecoratorIconsFolder() + name);
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

@@ -22,6 +22,7 @@ import com.intellij.application.options.SchemesToImportPopup;
import com.intellij.ide.highlighter.custom.SyntaxTable;
import com.intellij.ide.highlighter.custom.impl.ReadFileType;
import com.intellij.lang.Language;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.fileTypes.*;
import com.intellij.openapi.fileTypes.ex.FileTypeManagerEx;
@@ -35,7 +36,7 @@ import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.templateLanguages.TemplateDataLanguagePatterns;
import com.intellij.ui.*;
import com.intellij.ui.components.JBList;
import com.intellij.util.ui.UIUtil;
import com.intellij.util.IconUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -43,8 +44,6 @@ import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.*;
@@ -134,13 +133,13 @@ public class FileTypeConfigurable extends BaseConfigurable implements Searchable
public void reset() {
myTempPatternsTable = myManager.getExtensionMap().copy();
myTempTemplateDataLanguages = TemplateDataLanguagePatterns.getInstance().getAssocTable();
myTempFileTypes = new HashSet<FileType>(Arrays.asList(getModifiableFileTypes()));
myOriginalToEditedMap.clear();
updateFileTypeList();
updateExtensionList();
myFileTypePanel.myIgnoreFilesField.setText(myManager.getIgnoredFilesList());
}
@@ -148,7 +147,8 @@ public class FileTypeConfigurable extends BaseConfigurable implements Searchable
if (!myManager.isIgnoredFilesListEqualToCurrent(myFileTypePanel.myIgnoreFilesField.getText())) return true;
HashSet types = new HashSet(Arrays.asList(getModifiableFileTypes()));
return !myTempPatternsTable.equals(myManager.getExtensionMap()) || !myTempFileTypes.equals(types) ||
!myOriginalToEditedMap.isEmpty() || !myTempTemplateDataLanguages.equals(TemplateDataLanguagePatterns.getInstance().getAssocTable());
!myOriginalToEditedMap.isEmpty() ||
!myTempTemplateDataLanguages.equals(TemplateDataLanguagePatterns.getInstance().getAssocTable());
}
public void disposeUIResources() {
@@ -194,7 +194,7 @@ public class FileTypeConfigurable extends BaseConfigurable implements Searchable
UserFileType ftToEdit = myOriginalToEditedMap.get(fileType);
if (ftToEdit == null) ftToEdit = ((UserFileType)fileType).clone();
TypeEditor editor =
new TypeEditor(myRecognizedFileType.myEditButton, ftToEdit, FileTypesBundle.message("filetype.edit.existing.title"));
new TypeEditor(myRecognizedFileType.myFileTypesList, ftToEdit, FileTypesBundle.message("filetype.edit.existing.title"));
editor.show();
if (editor.isOK()) {
myOriginalToEditedMap.put((UserFileType)fileType, ftToEdit);
@@ -220,7 +220,8 @@ public class FileTypeConfigurable extends BaseConfigurable implements Searchable
private void addFileType() {
//TODO: support adding binary file types...
AbstractFileType type = new AbstractFileType(new SyntaxTable());
TypeEditor<AbstractFileType> editor = new TypeEditor<AbstractFileType>(myRecognizedFileType.myAddButton, type, FileTypesBundle.message("filetype.edit.new.title"));
TypeEditor<AbstractFileType> editor =
new TypeEditor<AbstractFileType>(myRecognizedFileType.myFileTypesList, type, FileTypesBundle.message("filetype.edit.new.title"));
editor.show();
if (editor.isOK()) {
myTempFileTypes.add(type);
@@ -242,7 +243,9 @@ public class FileTypeConfigurable extends BaseConfigurable implements Searchable
if (type == null) return;
final String title =
item == null ? FileTypesBundle.message("filetype.edit.add.pattern.title") : FileTypesBundle.message("filetype.edit.edit.pattern.title");
item == null
? FileTypesBundle.message("filetype.edit.add.pattern.title")
: FileTypesBundle.message("filetype.edit.edit.pattern.title");
final Language oldLanguage = item == null ? null : myTempTemplateDataLanguages.findAssociatedFileType(item);
final FileTypePatternDialog dialog = new FileTypePatternDialog(item, type, oldLanguage);
@@ -259,20 +262,21 @@ public class FileTypeConfigurable extends BaseConfigurable implements Searchable
FileType registeredFileType = findExistingFileType(matcher);
if (registeredFileType != null && registeredFileType != type) {
if (registeredFileType.isReadOnly()) {
Messages.showMessageDialog(myPatterns.myAddButton,
Messages.showMessageDialog(myPatterns.myPatternsList,
FileTypesBundle.message("filetype.edit.add.pattern.exists.error", registeredFileType.getDescription()),
title, Messages.getErrorIcon());
return;
}
else {
if (0 == Messages.showOkCancelDialog(myPatterns.myAddButton, FileTypesBundle.message("filetype.edit.add.pattern.exists.message",
registeredFileType.getDescription()),
FileTypesBundle.message("filetype.edit.add.pattern.exists.title"),
FileTypesBundle.message("filetype.edit.add.pattern.reassign.button"),
CommonBundle.getCancelButtonText(), Messages.getQuestionIcon())) {
if (0 == Messages.showOkCancelDialog(myPatterns.myPatternsList, FileTypesBundle.message("filetype.edit.add.pattern.exists.message",
registeredFileType.getDescription()),
FileTypesBundle.message("filetype.edit.add.pattern.exists.title"),
FileTypesBundle.message("filetype.edit.add.pattern.reassign.button"),
CommonBundle.getCancelButtonText(), Messages.getQuestionIcon())) {
myTempPatternsTable.removeAssociation(matcher, registeredFileType);
myTempTemplateDataLanguages.removeAssociation(matcher, oldLanguage);
} else {
}
else {
return;
}
}
@@ -345,16 +349,13 @@ public class FileTypeConfigurable extends BaseConfigurable implements Searchable
public static class RecognizedFileTypes extends JPanel {
private JList myFileTypesList;
private JButton myAddButton;
private JButton myEditButton;
private JButton myRemoveButton;
private JPanel myWholePanel;
private JButton myExportButton;
private JButton myImportButton;
private FileTypeConfigurable myController;
public RecognizedFileTypes() {
super(new BorderLayout());
add(myWholePanel, BorderLayout.CENTER);
myFileTypesList = new JBList(new DefaultListModel());
myFileTypesList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
myFileTypesList.setCellRenderer(new FileTypeRenderer(myFileTypesList.getCellRenderer(), new FileTypeRenderer.FileTypeListProvider() {
public Iterable<FileType> getCurrentFileTypeList() {
ArrayList<FileType> result = new ArrayList<FileType>();
@@ -364,16 +365,80 @@ public class FileTypeConfigurable extends BaseConfigurable implements Searchable
return result;
}
}));
myFileTypesList.setModel(new DefaultListModel());
myFileTypesList.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) myController.editFileType();
}
});
if (getSchemesManager().isImportAvailable()) {
myImportButton.setVisible(true);
}
if (getSchemesManager().isExportAvailable()) {
myExportButton.setVisible(true);
}
ToolbarDecorator toolbarDecorator = ToolbarDecorator.createDecorator(myFileTypesList)
.setAddAction(new AnActionButtonRunnable() {
@Override
public void run(AnActionButton button) {
myController.addFileType();
}
}).setRemoveAction(new AnActionButtonRunnable() {
@Override
public void run(AnActionButton button) {
myController.removeFileType();
}
}).setEditAction(new AnActionButtonRunnable() {
@Override
public void run(AnActionButton button) {
myController.editFileType();
}
}).setEditActionUpdater(new AnActionButtonUpdater() {
@Override
public boolean isEnabled(AnActionEvent e) {
final FileType fileType = getSelectedFileType();
return canBeModified(fileType);
}
}).setRemoveActionUpdater(new AnActionButtonUpdater() {
@Override
public boolean isEnabled(AnActionEvent e) {
final FileType fileType = getSelectedFileType();
final boolean modified = canBeModified(fileType);
final boolean shared = getSchemesManager().isShared(fileType);
return shared || modified;
}
}).disableUpDownActions();
//if (getSchemesManager().isImportAvailable()) {
toolbarDecorator.addExtraAction(new AnActionButton("Import Shared...", IconUtil.getImportIcon()) {
@Override
public void actionPerformed(AnActionEvent e) {
new SchemesToImportPopup<FileType, AbstractFileType>(myFileTypesList) {
protected void onSchemeSelected(final AbstractFileType scheme) {
myController.importFileType(scheme);
}
}.show(getSchemesManager(), collectRegisteredFileTypes());
}
});
//}
//if (getSchemesManager().isExportAvailable()) {
toolbarDecorator.addExtraAction(new AnActionButton("Share...", IconUtil.getExportIcon()) {
@Override
public void actionPerformed(AnActionEvent e) {
FileType selected = (FileType)myFileTypesList.getSelectedValue();
if (selected instanceof AbstractFileType) {
ExportSchemeAction.doExport((AbstractFileType)selected, getSchemesManager());
}
}
@Override
public void updateButton(AnActionEvent e) {
FileType fileType = getSelectedFileType();
boolean b = canBeModified(fileType);
boolean shared = getSchemesManager().isShared(fileType);
setEnabled(b && !shared);
}
});
//}
add(toolbarDecorator.createPanel(), BorderLayout.CENTER);
setBorder(IdeBorderFactory.createTitledBorder(FileTypesBundle.message("filetypes.recognized.group"), false));
}
private SchemesManager<FileType, AbstractFileType> getSchemesManager() {
@@ -381,58 +446,7 @@ public class FileTypeConfigurable extends BaseConfigurable implements Searchable
}
public void attachActions(final FileTypeConfigurable controller) {
myAddButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
controller.addFileType();
}
});
myEditButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
controller.editFileType();
}
});
myFileTypesList.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
FileType fileType = getSelectedFileType();
boolean b = canBeModified(fileType);
myEditButton.setEnabled(b);
myRemoveButton.setEnabled(b);
boolean shared = getSchemesManager().isShared(fileType);
myExportButton.setEnabled(b && !shared);
if (shared) {
myRemoveButton.setEnabled(true);
}
}
});
myRemoveButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
controller.removeFileType();
}
});
myFileTypesList.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) controller.editFileType();
}
});
myImportButton.addActionListener(new ActionListener(){
public void actionPerformed(final ActionEvent e) {
new SchemesToImportPopup<FileType, AbstractFileType>(myWholePanel){
protected void onSchemeSelected(final AbstractFileType scheme) {
controller.importFileType(scheme);
}
}.show(getSchemesManager(), collectRegisteredFileTypes());
}
});
myExportButton.addActionListener(new ActionListener(){
public void actionPerformed(final ActionEvent e) {
FileType selected = (FileType)myFileTypesList.getSelectedValue();
if (selected instanceof AbstractFileType) {
ExportSchemeAction.doExport((AbstractFileType)selected, getSchemesManager());
}
}
});
myController = controller;
}
private Collection<FileType> collectRegisteredFileTypes() {
@@ -448,7 +462,7 @@ public class FileTypeConfigurable extends BaseConfigurable implements Searchable
}
public JComponent getComponent() {
return myWholePanel;
return this;
}
public void setFileTypes(FileType[] types) {
@@ -489,13 +503,10 @@ public class FileTypeConfigurable extends BaseConfigurable implements Searchable
updateFileTypeList();
updateExtensionList();
myRecognizedFileType.selectFileType(type);
}
public static class PatternsPanel extends JPanel {
private JBList myPatternsList;
private JComponent myAddButton;
private JPanel myWholePanel;
private FileTypeConfigurable myController;
public PatternsPanel() {
@@ -505,27 +516,25 @@ public class FileTypeConfigurable extends BaseConfigurable implements Searchable
myPatternsList.setCellRenderer(new ExtensionRenderer());
myPatternsList.getEmptyText().setText(FileTypesBundle.message("filetype.settings.no.patterns"));
myWholePanel = ToolbarDecorator.createDecorator(myPatternsList)
.setAddAction(new AnActionButtonRunnable() {
@Override
public void run(AnActionButton button) {
myController.addPattern();
}
}).setEditAction(new AnActionButtonRunnable() {
@Override
public void run(AnActionButton button) {
myController.editPattern();
}
}).setRemoveAction(new AnActionButtonRunnable() {
@Override
public void run(AnActionButton button) {
myController.removePattern();
}
}).disableUpDownActions().createPanel();
UIUtil.addBorder(myWholePanel, IdeBorderFactory.createTitledBorder(FileTypesBundle.message("filetype.registered.patterns.group"), false));
myAddButton = ToolbarDecorator.findAddButton(myWholePanel).getContextComponent();
add(ToolbarDecorator.createDecorator(myPatternsList)
.setAddAction(new AnActionButtonRunnable() {
@Override
public void run(AnActionButton button) {
myController.addPattern();
}
}).setEditAction(new AnActionButtonRunnable() {
@Override
public void run(AnActionButton button) {
myController.editPattern();
}
}).setRemoveAction(new AnActionButtonRunnable() {
@Override
public void run(AnActionButton button) {
myController.removePattern();
}
}).disableUpDownActions().createPanel(), BorderLayout.CENTER);
add(myWholePanel, BorderLayout.CENTER);
setBorder(IdeBorderFactory.createTitledBorder(FileTypesBundle.message("filetype.registered.patterns.group"), false));
}
public void attachActions(final FileTypeConfigurable controller) {
@@ -533,7 +542,7 @@ public class FileTypeConfigurable extends BaseConfigurable implements Searchable
}
public JComponent getComponent() {
return myWholePanel;
return this;
}
public void clearList() {
@@ -1,82 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.intellij.openapi.fileTypes.impl.FileTypeConfigurable.RecognizedFileTypes">
<grid id="82e7b" binding="myWholePanel" layout-manager="GridLayoutManager" row-count="6" 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>
<xy x="115" y="72" width="597" height="345"/>
</constraints>
<properties/>
<clientProperties>
<BorderFactoryClass class="java.lang.String" value="com.intellij.ui.IdeBorderFactory$PlainSmallWithoutIndent"/>
</clientProperties>
<border type="etched" title-resource-bundle="messages/FileTypesBundle" title-key="filetypes.recognized.group"/>
<children>
<scrollpane id="de9d1" class="com.intellij.ui.components.JBScrollPane">
<constraints>
<grid row="0" column="0" row-span="6" col-span="1" vsize-policy="7" hsize-policy="7" anchor="0" fill="3" indent="0" use-parent-layout="false">
<minimum-size width="80" height="80"/>
<preferred-size width="200" height="150"/>
</grid>
</constraints>
<properties/>
<border type="none"/>
<children>
<component id="f12a0" class="com.intellij.ui.components.JBList" binding="myFileTypesList">
<constraints/>
<properties>
<selectionMode value="0"/>
</properties>
</component>
</children>
</scrollpane>
<component id="2631f" class="javax.swing.JButton" binding="myEditButton">
<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/FileTypesBundle" key="filetypes.recognized.edit.button"/>
</properties>
</component>
<component id="eb813" class="javax.swing.JButton" binding="myAddButton">
<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/FileTypesBundle" key="filetypes.recognized.add.button"/>
</properties>
</component>
<component id="55eb9" class="javax.swing.JButton" binding="myRemoveButton">
<constraints>
<grid row="2" 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/FileTypesBundle" key="filetypes.recognized.remove.button"/>
</properties>
</component>
<vspacer id="73ae2">
<constraints>
<grid row="5" 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="274f" class="javax.swing.JButton" binding="myExportButton" default-binding="true">
<constraints>
<grid row="3" 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 value="&amp;Share..."/>
<visible value="false"/>
</properties>
</component>
<component id="69cb9" class="javax.swing.JButton" binding="myImportButton" default-binding="true">
<constraints>
<grid row="4" 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>
<enabled value="true"/>
<text value="&amp;Import Shared..."/>
<visible value="false"/>
</properties>
</component>
</children>
</grid>
</form>
@@ -24,6 +24,7 @@ import com.intellij.openapi.options.SettingsEditor;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.ui.*;
import com.intellij.ui.components.JBList;
import com.intellij.util.ui.FormBuilder;
import com.intellij.util.ui.GridBag;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
@@ -136,25 +137,10 @@ public class CustomFileTypeEditor extends SettingsEditor<AbstractFileType> {
JPanel panel = new JPanel(new BorderLayout());
JPanel fileTypePanel = new JPanel(new BorderLayout());
JPanel info = new JPanel(new GridBagLayout());
GridBagConstraints gc = new GridBagConstraints();
gc.gridx = 0;
gc.gridy = 0;
gc.anchor = GridBagConstraints.WEST;
gc.fill = GridBagConstraints.BOTH;
info.add(new JLabel(IdeBundle.message("editbox.customfiletype.name")), gc);
gc.gridx = 1;
gc.gridy = 0;
gc.weightx = 1;
info.add(myFileTypeName, gc);
gc.weightx = 0;
gc.gridx = 0;
gc.gridy = 1;
info.add(new JLabel(IdeBundle.message("editbox.customfiletype.description")), gc);
gc.gridx = 1;
info.add(myFileTypeDescr, gc);
info.setBorder(BorderFactory.createEmptyBorder(5, 0, 5, 5));
JPanel info = FormBuilder.createFormBuilder()
.addLabeledComponent(IdeBundle.message("editbox.customfiletype.name"), myFileTypeName)
.addLabeledComponent(IdeBundle.message("editbox.customfiletype.description"), myFileTypeDescr).getPanel();
info.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0));
fileTypePanel.add(info, BorderLayout.NORTH);
JPanel highlighterPanel = new JPanel();
@@ -164,10 +150,11 @@ public class CustomFileTypeEditor extends SettingsEditor<AbstractFileType> {
commentsAndNumbersPanel.setLayout(new GridBagLayout());
JPanel _panel1 = new JPanel(new BorderLayout());
GridBag gb = new GridBag().setDefaultFill(GridBagConstraints.HORIZONTAL).setDefaultAnchor(GridBagConstraints.WEST).setDefaultInsets(1,
5,
1,
5);
GridBag gb = new GridBag()
.setDefaultFill(GridBagConstraints.HORIZONTAL)
.setDefaultAnchor(GridBagConstraints.WEST)
.setDefaultInsets(1, 5, 1, 5);
commentsAndNumbersPanel.add(new JLabel(IdeBundle.message("editbox.customfiletype.line.comment")), gb.nextLine().next());
commentsAndNumbersPanel.add(myLineComment, gb.next());
commentsAndNumbersPanel.add(myCommentAtLineStart, gb.next().coverLine(2));