/*
* Zed Attack Proxy (ZAP) and its related class files.
*
* ZAP is an HTTP/HTTPS proxy for assessing web application security.
*
* 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 org.zaproxy.zap.extension.lang;
import java.awt.CardLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.filechooser.FileFilter;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import org.parosproxy.paros.Constant;
import org.parosproxy.paros.model.Model;
import org.parosproxy.paros.model.OptionsParam;
import org.parosproxy.paros.view.AbstractParamPanel;
import org.zaproxy.zap.utils.LocaleUtils;
import org.zaproxy.zap.utils.ZapTextField;
import org.zaproxy.zap.view.ViewLocale;
public class OptionsLangPanel extends AbstractParamPanel {
private static final long serialVersionUID = 1L;
private JPanel panelLang = null;
private JLabel languageLabel = null;
private JLabel importLabel = null;
private JLabel restartLabel = null;
private JButton selectionButton = null;
private JButton importButton = null;
private JComboBox<ViewLocale> localeSelect = null;
private ZapTextField fileTextField = null;
private Document fileTextFieldDoc = null;
public OptionsLangPanel() {
super();
initialize();
}
private void initialize() {
this.setLayout(new CardLayout());
this.setName(Constant.messages.getString("options.lang.title"));
this.add(getPanelLang(), getPanelLang().getName());
}
private JPanel getPanelLang() {
if (panelLang == null) {
panelLang = new JPanel();
panelLang.setName(Constant.messages.getString("options.lang.title"));
panelLang.setLayout(new GridBagLayout());
if (Model.getSingleton().getOptionsParam().getViewParam().getWmUiHandlingOption() == 0) {
panelLang.setSize(409, 268);
}
languageLabel = new JLabel(Constant.messages.getString("options.lang.selector.label"));
importLabel = new JLabel(Constant.messages.getString("options.lang.importer.label"));
restartLabel = new JLabel(Constant.messages.getString("options.lang.label.restart"));
panelLang.add(languageLabel, getGridBagConstraints(0, 0, 0.5, 0, 0, 0, 0));
panelLang.add(getLocaleSelect(), getGridBagConstraints(1, 0, 0.5, 0, 0, 0, 0));
panelLang.add(importLabel, getGridBagConstraints(0, 1, 1.0, 0, 2, 0, 0));
panelLang.add(getFileTextField(), getGridBagConstraints(0, 2, 1.0, 0, 2, 0, 0));
JPanel buttons = new JPanel();
buttons.setLayout(new BoxLayout(buttons, BoxLayout.X_AXIS));
buttons.add(Box.createHorizontalGlue());
buttons.add(getImportButton());
buttons.add(getSelectionButton());
panelLang.add(buttons, getGridBagConstraints(0, 3, 0.5, 0, 2, 0, GridBagConstraints.NORTHEAST));
panelLang.add(restartLabel, getGridBagConstraints(0, 4, 1.0, 0, 2, 0, 0));
panelLang.add(new JLabel(""), getGridBagConstraints(0, 5, 1.0, 1.0, 2, GridBagConstraints.BOTH, 0));
}
return panelLang;
}
private GridBagConstraints getGridBagConstraints(int x, int y, double weightx, double weighty, int columnWidth, int fill, int anchor) {
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = x;
gbc.gridy = y;
gbc.weightx = weightx;
gbc.weighty = weighty;
gbc.insets = new java.awt.Insets(2,2,2,2);
gbc.gridwidth = (columnWidth > 0) ? columnWidth : 1;
gbc.fill = (fill > 0) ? fill : GridBagConstraints.HORIZONTAL;
gbc.anchor = (anchor > 0) ? anchor : GridBagConstraints.NORTHWEST;
return gbc;
}
private ZapTextField getFileTextField() {
if (fileTextField == null) {
fileTextField = new ZapTextField();
fileTextFieldDoc = fileTextField.getDocument();
fileTextFieldDoc.addDocumentListener(new DocumentListener() {
@Override
public void changedUpdate(DocumentEvent e) {
updated(e);
}
@Override
public void insertUpdate(DocumentEvent e) {
updated(e);
}
@Override
public void removeUpdate(DocumentEvent e) {
updated(e);
}
private void updated(DocumentEvent e) {
try {
String inputString = e.getDocument().getText(0, e.getDocument().getLength());
importButton.setEnabled(inputString.endsWith(".zaplang"));
} catch (BadLocationException e1) {
//logger.error(e1.getMessage());
}
}
});
}
return fileTextField;
}
private JButton getSelectionButton() {
if (selectionButton == null) {
selectionButton = new JButton();
selectionButton.setText(Constant.messages.getString("options.lang.importer.browse"));
selectionButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
browseButtonActionPerformed(evt);
}
});
}
return selectionButton;
}
private JButton getImportButton() {
if (importButton == null) {
importButton = new JButton();
importButton.setEnabled(false);
importButton.setText(Constant.messages.getString("options.lang.importer.button"));
importButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
if (!fileTextField.getText().equals("")) {
LangImporter.importLanguagePack(fileTextField.getText());
fileTextField.setText("");
fileTextField.discardAllEdits();
loadLocales();
}
}
});
}
return importButton;
}
private JComboBox<ViewLocale> getLocaleSelect() {
if (localeSelect == null) {
localeSelect = new JComboBox<>();
loadLocales();
}
return localeSelect;
}
private void browseButtonActionPerformed(ActionEvent evt) {
final JFileChooser fc = new JFileChooser();
fc.setFileFilter(new FileFilter() {
@Override
public String getDescription() {
return Constant.messages.getString("options.lang.file.chooser.description");
}
@Override
public boolean accept(java.io.File f) {
return f.isDirectory() || f.getName().toLowerCase().endsWith(".zaplang");
}
});
final int state = fc.showOpenDialog(null);
if (state == JFileChooser.APPROVE_OPTION) {
fileTextField.setText(fc.getSelectedFile().toString());
fileTextField.discardAllEdits();
}
}
private void loadLocales() {
localeSelect.removeAllItems();
for (ViewLocale locale : LocaleUtils.getAvailableViewLocales()) {
localeSelect.addItem(locale);
}
}
@Override
public void initParam(Object obj) {
OptionsParam options = (OptionsParam) obj;
ViewLocale locale = LocaleUtils.getViewLocale(options.getViewParam().getLocale());
localeSelect.setSelectedItem(locale);
}
@Override
public void saveParam (Object obj) throws Exception {
OptionsParam options = (OptionsParam) obj;
ViewLocale selectedLocale = (ViewLocale) localeSelect.getSelectedItem();
if (selectedLocale != null) {
options.getViewParam().setLocale(selectedLocale.getLocale());
}
}
@Override
public String getHelpIndex() {
return "ui.dialogs.options.language";
}
}