Color schemes panel UI refactoring

This commit is contained in:
Rustam Vishnyakov
2016-12-05 18:15:01 +03:00
parent 2865804176
commit f8a22f70a5
3 changed files with 151 additions and 122 deletions
@@ -81,6 +81,13 @@ public abstract class DefaultSchemeActions<T extends Scheme> {
public void actionPerformed(AnActionEvent e) {
doReset();
}
@Override
public void update(AnActionEvent e) {
Presentation p = e.getPresentation();
T currentScheme = getCurrentScheme();
p.setEnabled(currentScheme != null && isResetAvailable(currentScheme));
}
}
@@ -188,6 +195,10 @@ public abstract class DefaultSchemeActions<T extends Scheme> {
protected abstract boolean isDeleteAvailable(@NotNull T scheme);
protected boolean isResetAvailable(@NotNull T scheme) {
return true;
}
protected abstract void doExport(@NotNull T scheme, @NotNull String exporterName);
@Nullable
@@ -0,0 +1,128 @@
/*
* Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.application.options.colors;
import com.intellij.application.options.DefaultSchemeActions;
import com.intellij.application.options.SaveSchemeDialog;
import com.intellij.openapi.application.ApplicationBundle;
import com.intellij.openapi.editor.colors.EditorColorsScheme;
import com.intellij.openapi.editor.colors.impl.AbstractColorsScheme;
import com.intellij.openapi.editor.colors.impl.EditorColorsSchemeImpl;
import com.intellij.openapi.editor.colors.impl.EmptyColorScheme;
import com.intellij.openapi.editor.colors.impl.ReadOnlyColorsScheme;
import com.intellij.openapi.options.*;
import com.intellij.openapi.project.DefaultProjectFactory;
import com.intellij.openapi.ui.MessageType;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.List;
public abstract class ColorSchemeActions extends DefaultSchemeActions<EditorColorsScheme> {
private final ColorAndFontOptions myOptions;
private JComponent myParentComponent;
public ColorSchemeActions(@NotNull JComponent parentComponent, @NotNull ColorAndFontOptions options) {
myOptions = options;
myParentComponent = parentComponent;
}
@Override
protected void doImport(@NotNull String importerName) {
final SchemeImporter<EditorColorsScheme> importer = SchemeImporterEP.getImporter(importerName, EditorColorsScheme.class);
if (importer != null) {
VirtualFile importSource = SchemeImportUtil.selectImportSource(importer.getSourceExtensions(), myParentComponent, null);
if (importSource != null) {
try {
EditorColorsScheme imported =
importer.importScheme(DefaultProjectFactory.getInstance().getDefaultProject(), importSource, myOptions.getSelectedScheme(),
name -> {
String newName = myOptions.getUniqueName(name != null ? name : "Unnamed");
AbstractColorsScheme newScheme = new EditorColorsSchemeImpl(EmptyColorScheme.INSTANCE);
newScheme.setName(newName);
newScheme.setDefaultMetaInfo(EmptyColorScheme.INSTANCE);
return newScheme;
});
if (imported != null) {
myOptions.addImportedScheme(imported);
}
}
catch (SchemeImportException e) {
SchemeImportUtil.showStatus(myParentComponent, "Import failed: " + e.getMessage(), MessageType.ERROR);
}
}
}
}
@Override
protected void doReset() {
EditorColorsScheme currentScheme = getCurrentScheme();
if (currentScheme != null) {
if (Messages
.showOkCancelDialog(ApplicationBundle.message("color.scheme.reset.message"),
ApplicationBundle.message("color.scheme.reset.title"), Messages.getQuestionIcon()) == Messages.OK) {
myOptions.resetSchemeToOriginal(currentScheme.getName());
}
}
}
@Override
protected void doSaveAs() {
List<String> names = ContainerUtil.newArrayList(myOptions.getSchemeNames());
String selectedName = AbstractColorsScheme.getDisplayName(myOptions.getSelectedScheme());
SaveSchemeDialog dialog =
new SaveSchemeDialog(myParentComponent, ApplicationBundle.message("title.save.color.scheme.as"), names, selectedName);
if (dialog.showAndGet()) {
myOptions.saveSchemeAs(dialog.getSchemeName());
}
}
@Override
protected void doDelete() {
EditorColorsScheme currentScheme = getCurrentScheme();
if (currentScheme != null) {
myOptions.removeScheme(currentScheme.getName());
}
}
@Override
protected boolean isDeleteAvailable(@NotNull EditorColorsScheme scheme) {
return !ColorAndFontOptions.isReadOnly(scheme) && ColorAndFontOptions.canBeDeleted(scheme);
}
@Override
protected boolean isResetAvailable(@NotNull EditorColorsScheme scheme) {
AbstractColorsScheme originalScheme =
scheme instanceof AbstractColorsScheme ? ((AbstractColorsScheme)scheme).getOriginal() : null;
return
!ColorAndFontOptions.isReadOnly(scheme) &&
scheme.getName().startsWith(SchemeManager.EDITABLE_COPY_PREFIX) &&
originalScheme instanceof ReadOnlyColorsScheme;
}
@Override
protected void doExport(@NotNull EditorColorsScheme scheme, @NotNull String exporterName) {
// Unsupported for now.
}
@Override
protected Class<EditorColorsScheme> getSchemeType() {
return EditorColorsScheme.class;
}
}
@@ -16,24 +16,14 @@
package com.intellij.application.options.colors;
import com.intellij.application.options.ImportSourceChooserDialog;
import com.intellij.application.options.SaveSchemeDialog;
import com.intellij.application.options.SkipSelfSearchComponent;
import com.intellij.openapi.application.ApplicationBundle;
import com.intellij.openapi.editor.colors.EditorColorsScheme;
import com.intellij.openapi.editor.colors.impl.AbstractColorsScheme;
import com.intellij.openapi.editor.colors.impl.EditorColorsSchemeImpl;
import com.intellij.openapi.editor.colors.impl.EmptyColorScheme;
import com.intellij.openapi.editor.colors.impl.ReadOnlyColorsScheme;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.options.*;
import com.intellij.openapi.project.DefaultProjectFactory;
import com.intellij.openapi.ui.ComboBox;
import com.intellij.openapi.ui.MessageType;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.ui.ManageSchemesComboAction;
import com.intellij.util.EventDispatcher;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.ui.JBInsets;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -42,16 +32,12 @@ import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
public class SchemesPanel extends JPanel implements SkipSelfSearchComponent {
private final ColorAndFontOptions myOptions;
private ComboBox<MySchemeItem> mySchemeComboBox;
private JButton myDeleteButton;
private JButton myResetButton;
private JButton myImportButton;
private JLabel myHintLabel;
private final EventDispatcher<ColorAndFontSettingsListener> myDispatcher = EventDispatcher.create(ColorAndFontSettingsListener.class);
@@ -73,18 +59,10 @@ public class SchemesPanel extends JPanel implements SkipSelfSearchComponent {
String selectedName = getSelectedSchemeName();
if (selectedName != null) {
EditorColorsScheme selected = myOptions.selectScheme(selectedName);
final boolean readOnly = ColorAndFontOptions.isReadOnly(selected);
myDeleteButton.setEnabled(!readOnly && ColorAndFontOptions.canBeDeleted(selected));
myHintLabel.setVisible(readOnly);
myHintLabel.setVisible(ColorAndFontOptions.isReadOnly(selected));
if (areSchemesLoaded()) {
myDispatcher.getMulticaster().schemeChanged(SchemesPanel.this);
}
AbstractColorsScheme originalScheme =
selected instanceof AbstractColorsScheme ? ((AbstractColorsScheme)selected).getOriginal() : null;
myResetButton.setEnabled(
!readOnly &&
selectedName.startsWith(SchemeManager.EDITABLE_COPY_PREFIX) &&
originalScheme instanceof ReadOnlyColorsScheme);
}
}
});
@@ -107,61 +85,20 @@ public class SchemesPanel extends JPanel implements SkipSelfSearchComponent {
mySchemeComboBox = new ComboBox<>();
panel.add(mySchemeComboBox,
new GridBagConstraints(gridx++, 0, 1, 1, 0, 0, GridBagConstraints.WEST, GridBagConstraints.NONE, new JBInsets(0, 0, 5, 10),
new GridBagConstraints(gridx++, 0, 1, 1, 0, 0, GridBagConstraints.WEST, GridBagConstraints.VERTICAL, new JBInsets(0, 0, 5, 10),
0, 0));
JButton saveAsButton = new JButton(ApplicationBundle.message("button.save.as"));
saveAsButton.addActionListener(new ActionListener() {
ManageSchemesComboAction schemesComboAction = new ManageSchemesComboAction(new ColorSchemeActions(this, myOptions) {
@Nullable
@Override
public void actionPerformed(@NotNull ActionEvent e) {
showSaveAsDialog();
protected EditorColorsScheme getCurrentScheme() {
return myOptions.getScheme(getSelectedSchemeName());
}
});
panel.add(saveAsButton,
new GridBagConstraints(gridx++, 0, 1, 1, 0, 0, GridBagConstraints.WEST, GridBagConstraints.NONE, new JBInsets(0, 0, 5, 5),
JButton manageButton = schemesComboAction.createCombo();
panel.add(manageButton,
new GridBagConstraints(gridx++, 0, 1, 1, 0, 0, GridBagConstraints.WEST, GridBagConstraints.VERTICAL, new JBInsets(0, 0, 5, 5),
0, 0));
myDeleteButton = new JButton(ApplicationBundle.message("button.delete"));
myDeleteButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(@NotNull ActionEvent e) {
String selectedName = getSelectedSchemeName();
if (selectedName != null) {
myOptions.removeScheme(selectedName);
}
}
});
panel.add(myDeleteButton,
new GridBagConstraints(gridx++, 0, 1, 1, 0, 0, GridBagConstraints.WEST, GridBagConstraints.NONE, new JBInsets(0, 0, 5, 5), 0,
0));
myResetButton = new JButton(ApplicationBundle.message("color.scheme.reset"));
myResetButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(@NotNull ActionEvent e) {
String selectedName = getSelectedSchemeName();
if (selectedName != null) {
if (Messages
.showOkCancelDialog(ApplicationBundle.message("color.scheme.reset.message"),
ApplicationBundle.message("color.scheme.reset.title"), Messages.getQuestionIcon()) == Messages.OK) {
myOptions.resetSchemeToOriginal(selectedName);
}
}
}
});
panel.add(myResetButton,
new GridBagConstraints(gridx++, 0, 1, 1, 0, 0, GridBagConstraints.WEST, GridBagConstraints.NONE, new JBInsets(0, 0, 5, 5), 0,
0));
myImportButton = new JButton("Import...");
myImportButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
chooseAndImport();
}
});
myImportButton.setVisible(isImportAvailable());
panel.add(myImportButton,
new GridBagConstraints(gridx++, 0, 1, 1, 0, 0, GridBagConstraints.WEST, GridBagConstraints.NONE, new JBInsets(0, 0, 5, 5), 0,
0));
myHintLabel = new JLabel(ApplicationBundle.message("hint.readonly.scheme.cannot.be.modified"));
myHintLabel.setEnabled(false);
panel.add(myHintLabel,
@@ -189,15 +126,6 @@ public class SchemesPanel extends JPanel implements SkipSelfSearchComponent {
return panel;
}
private void showSaveAsDialog() {
List<String> names = ContainerUtil.newArrayList(myOptions.getSchemeNames());
String selectedName = AbstractColorsScheme.getDisplayName(myOptions.getSelectedScheme());
SaveSchemeDialog dialog = new SaveSchemeDialog(this, ApplicationBundle.message("title.save.color.scheme.as"), names, selectedName);
if (dialog.showAndGet()) {
myOptions.saveSchemeAs(dialog.getSchemeName());
}
}
@Deprecated
public boolean updateDescription(boolean modified) {
EditorColorsScheme scheme = myOptions.getSelectedScheme();
@@ -245,44 +173,6 @@ public class SchemesPanel extends JPanel implements SkipSelfSearchComponent {
myDispatcher.addListener(listener);
}
private void chooseAndImport() {
ImportSourceChooserDialog<EditorColorsScheme> importSourceChooserDialog =
new ImportSourceChooserDialog<>(this, EditorColorsScheme.class);
if (importSourceChooserDialog.showAndGet()) {
final String selectedImporterName = importSourceChooserDialog.getSelectedSourceName();
if (selectedImporterName != null) {
final SchemeImporter<EditorColorsScheme> importer = SchemeImporterEP.getImporter(selectedImporterName, EditorColorsScheme.class);
if (importer != null) {
VirtualFile importSource = SchemeImportUtil.selectImportSource(importer.getSourceExtensions(), this, null);
if (importSource != null) {
try {
EditorColorsScheme imported =
importer.importScheme(DefaultProjectFactory.getInstance().getDefaultProject(), importSource, myOptions.getSelectedScheme(),
name -> {
String newName = myOptions.getUniqueName(name);
AbstractColorsScheme newScheme = new EditorColorsSchemeImpl(EmptyColorScheme.INSTANCE);
newScheme.setName(newName);
newScheme.setDefaultMetaInfo(EmptyColorScheme.INSTANCE);
return newScheme;
});
if (imported != null) {
myOptions.addImportedScheme(imported);
}
}
catch (SchemeImportException e) {
SchemeImportUtil.showStatus(myImportButton, "Import failed: " + e.getMessage(), MessageType.ERROR);
}
}
}
}
}
}
private static boolean isImportAvailable() {
return !SchemeImporterEP.getExtensions(EditorColorsScheme.class).isEmpty();
}
private final static class MySchemeItem {
private EditorColorsScheme myScheme;