/**
* Copyright Plugtree LLC
*
* 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.plugtree.solrmeter.view;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileNotFoundException;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;
import org.apache.log4j.Logger;
import com.plugtree.solrmeter.controller.SettingsController;
import com.plugtree.solrmeter.controller.StatisticsRepository;
import com.plugtree.solrmeter.model.FileUtils;
import com.plugtree.solrmeter.view.settings.AuthenticationSettingsPanel;
import com.plugtree.solrmeter.view.settings.OptimizeSettingsPanel;
import com.plugtree.solrmeter.view.settings.QuerySettingsPanel;
import com.plugtree.solrmeter.view.settings.StatisticsSettingsPanel;
import com.plugtree.solrmeter.view.settings.UpdateSettingsPanel;
public class SettingsPanelContainer extends JPanel {
private static final long serialVersionUID = 6009079148719374295L;
private JTabbedPane tabPanel;
private JPanel buttonPanel;
private JButton buttonApply;
private JButton buttonOK;
private JButton buttonCancel;
private JButton okAndDefault;
private JButton buttonAdvanced;
private SettingsController settingsController;
private boolean editable;
private StatisticsRepository repository;
private AdvancedSettingsDialog advancedSettingsDialog;
public SettingsPanelContainer(Window parent, boolean editable, StatisticsRepository repository) {
super();
this.editable = editable;
this.repository = repository;
tabPanel = new JTabbedPane();
settingsController = new SettingsController(this, parent);
this.initGUI();
addTabs();
}
public AdvancedSettingsDialog getAdvancedSettingsDialog(){
if(advancedSettingsDialog == null){
advancedSettingsDialog = new AdvancedSettingsDialog(settingsController);
}
return advancedSettingsDialog;
}
private void addTabs() {
QuerySettingsPanel querySettingsPanel = new QuerySettingsPanel(settingsController, editable);
this.addSetting(querySettingsPanel);
this.addSetting(new UpdateSettingsPanel(settingsController, editable));
this.addSetting(new OptimizeSettingsPanel(settingsController, editable));
this.addSetting(new StatisticsSettingsPanel(settingsController, editable, repository));
this.addSetting(new AuthenticationSettingsPanel(settingsController, editable));
}
private void initGUI() {
buttonPanel = this.createButtonPanel();
this.setLayout(new GridBagLayout());
GridBagConstraints constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.BOTH;
int row = 0;
if(!editable) {
constraints.gridx = 0;
constraints.gridy = row;
constraints.weighty = 0.0;
JLabel messageLabel = new JLabel("<html><p>" + I18n.get("settings.noEditableMessage") + "</p></html>");
try {
messageLabel.setIcon(new ImageIcon(FileUtils.findFileAsResource("./images/warning.png")));
} catch (FileNotFoundException e) {
Logger.getLogger(SettingsPanelContainer.class).error("Image not found", e);
//no image added, but stil working.
}
this.add(messageLabel, constraints);
row++;
}
constraints.gridx = 0;
constraints.gridy = row;
constraints.weighty = 1.0;
this.add(tabPanel, constraints);
row++;
constraints.gridx = 0;
constraints.gridy = row;
constraints.weighty = 0.0;
constraints.weightx = 1.0;
this.add(buttonPanel,constraints);
}
private JPanel createButtonPanel() {
JPanel panel = new JPanel();
panel.setMaximumSize(new Dimension(Integer.MAX_VALUE, 40));
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
okAndDefault = new JButton(I18n.get("settings.button.okAndSetDefault"));
okAndDefault.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
settingsController.okAndSetDefault();
}
});
panel.add(okAndDefault);
buttonAdvanced = new JButton(I18n.get("settings.button.buttonAdvanced"));
buttonAdvanced.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
settingsController.advancedSettings();
}
});
panel.add(buttonAdvanced);
panel.add(Box.createHorizontalGlue());
buttonApply = new JButton(I18n.get("settings.button.apply"));
buttonApply.setEnabled(false);
buttonApply.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
settingsController.applyChanges();
}
});
panel.add(buttonApply);
panel.add(Box.createRigidArea(new Dimension(5, 5)));
buttonOK = new JButton(I18n.get("settings.button.ok"));
buttonOK.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
settingsController.acceptChanges();
}
});
}
});
panel.add(buttonOK);
panel.add(Box.createRigidArea(new Dimension(5, 5)));
buttonCancel = new JButton(I18n.get("settings.button.cancel"));
buttonCancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
settingsController.cancel();
}
});
panel.add(buttonCancel);
return panel;
}
public void addSetting(SettingsPanel panel) {
JScrollPane scrollPane = new JScrollPane(panel);
tabPanel.addTab(panel.getSettingsName(), scrollPane);
}
public void hasChangedValues(boolean hasChangedValues) {
buttonApply.setEnabled(hasChangedValues);
}
}