/*
* Copyright (c) 2008-2019 Emmanuel Dupuy.
* This project is distributed under the GPLv3 license.
* This is a Copyleft license that gives the user the right to use,
* copy and modify the code freely for non-commercial purposes.
*/
package org.jd.gui.service.preferencespanel;
import org.jd.gui.spi.PreferencesPanel;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Map;
import java.util.regex.Pattern;
public class MavenOrgSourceLoaderPreferencesProvider extends JPanel implements PreferencesPanel, DocumentListener, ActionListener {
public static final String ACTIVATED = "MavenOrgSourceLoaderPreferencesProvider.activated";
public static final String FILTERS = "MavenOrgSourceLoaderPreferencesProvider.filters";
public static final String DEFAULT_FILTERS_VALUE =
"+org +com.google +com.springsource +com.sun -com +java +javax +sun +sunw " +
"+spring +springframework +springmodules +tomcat +maven +edu";
protected static final Pattern CONTROL_PATTERN = Pattern.compile("([+-][a-zA-Z_0-9$_.]+(\\s+[+-][a-zA-Z_0-9$_.]+)*)?\\s*");
protected JCheckBox enableCheckBox;
protected JTextArea filtersTextArea;
protected JButton resetButton;
protected Color errorBackgroundColor = Color.RED;
protected Color defaultBackgroundColor;
protected PreferencesPanel.PreferencesPanelChangeListener listener;
public MavenOrgSourceLoaderPreferencesProvider() {
super(new BorderLayout());
enableCheckBox = new JCheckBox("Search source code on maven.org for:");
enableCheckBox.addActionListener(this);
filtersTextArea = new JTextArea();
filtersTextArea.setFont(getFont());
filtersTextArea.setLineWrap(true);
filtersTextArea.getDocument().addDocumentListener(this);
defaultBackgroundColor = filtersTextArea.getBackground();
JComponent spacer = new JComponent() {};
JScrollPane scrollPane = new JScrollPane(filtersTextArea);
String osName = System.getProperty("os.name").toLowerCase();
if (osName.contains("windows")) {
spacer.setPreferredSize(new Dimension(22, -1));
scrollPane.setPreferredSize(new Dimension(-1, 50));
} else if (osName.contains("mac os")) {
spacer.setPreferredSize(new Dimension(28, -1));
scrollPane.setPreferredSize(new Dimension(-1, 56));
} else {
spacer.setPreferredSize(new Dimension(22, -1));
scrollPane.setPreferredSize(new Dimension(-1, 56));
}
resetButton = new JButton("Reset");
resetButton.addActionListener(this);
JPanel southPanel = new JPanel(new BorderLayout());
southPanel.add(resetButton, BorderLayout.EAST);
add(enableCheckBox, BorderLayout.NORTH);
add(spacer, BorderLayout.WEST);
add(scrollPane, BorderLayout.CENTER);
add(southPanel, BorderLayout.SOUTH);
}
// --- PreferencesPanel --- //
@Override public String getPreferencesGroupTitle() { return "Source loader"; }
@Override public String getPreferencesPanelTitle() { return "maven.org"; }
@Override public JComponent getPanel() { return this; }
@Override
public void init(Color errorBackgroundColor) {
this.errorBackgroundColor = errorBackgroundColor;
}
@Override public boolean isActivated() { return true; }
@Override
public void loadPreferences(Map<String, String> preferences) {
boolean enabled = !"false".equals(preferences.get(ACTIVATED));
enableCheckBox.setSelected(enabled);
filtersTextArea.setEnabled(enabled);
resetButton.setEnabled(enabled);
String filters = preferences.get(FILTERS);
filtersTextArea.setText((filters == null) || filters.isEmpty() ? DEFAULT_FILTERS_VALUE : filters);
}
@Override
public void savePreferences(Map<String, String> preferences) {
preferences.put(ACTIVATED, Boolean.toString(enableCheckBox.isSelected()));
preferences.put(FILTERS, filtersTextArea.getText().trim());
}
@Override public boolean arePreferencesValid() {
return CONTROL_PATTERN.matcher(filtersTextArea.getText()).matches();
}
@Override public void addPreferencesChangeListener(PreferencesPanelChangeListener listener) {
this.listener = listener;
}
// --- DocumentListener --- //
@Override public void insertUpdate(DocumentEvent e) { onTextChange(); }
@Override public void removeUpdate(DocumentEvent e) { onTextChange(); }
@Override public void changedUpdate(DocumentEvent e) { onTextChange(); }
protected void onTextChange() {
filtersTextArea.setBackground(arePreferencesValid() ? defaultBackgroundColor : errorBackgroundColor);
if (listener != null) {
listener.preferencesPanelChanged(this);
}
}
// --- ActionListener --- //
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == enableCheckBox) {
boolean enabled = enableCheckBox.isSelected();
filtersTextArea.setEnabled(enabled);
resetButton.setEnabled(enabled);
} else {
// Reset button
filtersTextArea.setText(DEFAULT_FILTERS_VALUE);
filtersTextArea.requestFocus();
}
}
}