/*
* Copyright 2003-2013 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 jetbrains.mps.nodeEditor.hintsSettings;
import com.intellij.ui.IdeBorderFactory;
import jetbrains.mps.openapi.editor.descriptor.ConceptEditorHint;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JPanel;
import java.awt.event.ItemEvent;
import java.awt.Component;
import java.awt.GridBagLayout;
import java.util.ArrayList;
import java.util.Collections;
/**
* Semen Alperovich
* 05 15, 2013
*/
public class ConceptEditorHintPreferencesPage {
private JPanel myPreferencesPanel;
private final ConceptEditorHintSettings currentSettings = new ConceptEditorHintSettings();
private final ConceptEditorHintSettings registrySettings;
public ConceptEditorHintPreferencesPage(ConceptEditorHintSettings state) {
registrySettings = state != null ? state : new ConceptEditorHintSettings();
}
public JComponent getComponent() {
if (myPreferencesPanel == null) {
myPreferencesPanel = new JPanel(new GridBagLayout());
update();
}
return myPreferencesPanel;
}
public boolean isModified() {
for (String langName : currentSettings.getLanguagesNames()) {
for (ConceptEditorHint hint : currentSettings.getHints(langName)) {
if (!registrySettings.containsKey(langName, hint)) {
continue;
}
if (!registrySettings.get(langName, hint).equals(currentSettings.get(langName, hint))) {
return true;
}
}
}
return false;
}
public void reset() {
update();
}
private void update() {
myPreferencesPanel.removeAll();
syncSettings(registrySettings, currentSettings);
myPreferencesPanel.setLayout(new BoxLayout(myPreferencesPanel, BoxLayout.Y_AXIS));
ArrayList<String> names = new ArrayList<String>(currentSettings.getLanguagesNames());
Collections.sort(names);
for (String langName : names) {
if (langName != null) {
JPanel languagePanel = new JPanel();
languagePanel.setLayout(new BoxLayout(languagePanel, BoxLayout.Y_AXIS));
languagePanel.add(Box.createHorizontalGlue());
languagePanel.setBorder(IdeBorderFactory.createTitledBorder(langName, false));
languagePanel.setAlignmentX(Component.CENTER_ALIGNMENT);
for (ConceptEditorHint hint : currentSettings.getHints(langName)) {
addHintCheckbox(languagePanel, langName, hint, currentSettings.get(langName, hint));
}
myPreferencesPanel.add(languagePanel);
}
}
}
private void syncSettings(ConceptEditorHintSettings from, ConceptEditorHintSettings where) {
where.clear();
where.putAll(from);
}
private void addHintCheckbox(JPanel panel, final String lang, final ConceptEditorHint hint, boolean state) {
JCheckBox item = new JCheckBox(hint.getId() + ": " + hint.getPresentation());
item.setSelected(state);
panel.add(item);
item.addItemListener(e -> {
assert currentSettings.containsKey(lang, hint);
currentSettings.put(lang, hint, e.getStateChange() == ItemEvent.SELECTED);
});
}
public void commit() {
syncSettings(currentSettings, registrySettings);
}
}