phex.gui.dialogs.options.SharingPane.java Source code

Java tutorial

Introduction

Here is the source code for phex.gui.dialogs.options.SharingPane.java

Source

/*
 *  PHEX - The pure-java Gnutella-servent.
 *  Copyright (C) 2001 - 2006 Phex Development Group
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 * 
 *  --- CVS Information ---
 *  $Id$
 */
package phex.gui.dialogs.options;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;

import javax.swing.JCheckBox;
import javax.swing.JLabel;

import phex.gui.common.GUIUtils;
import phex.gui.common.IntegerTextField;
import phex.prefs.core.LibraryPrefs;
import phex.prefs.core.UploadPrefs;
import phex.utils.Localizer;

import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;

public class SharingPane extends OptionsSettingsPane {
    private static final String SIMULTANEOUS_UPLOADS_KEY = "SimultaneousUploads";
    private static final String UPLOADS_PER_HOST_KEY = "UploadsPerHost";
    private static final String RETURNED_SEARCH_LIMIT_KEY = "ReturnedSearchLimit";
    private static final String QUEUE_LIMIT_KEY = "QueueLimit";
    private static final String MIN_POLL_TIME_KEY = "UploadQueueMinPollTime";
    private static final String MAX_POLL_TIME_KEY = "UploadQueueMaxPollTime";

    private static final String SEARCH_HIT_LIMIT_ERROR_KEY = "SearchHitLimitError";

    private IntegerTextField simultaneousUploadsTF;
    private IntegerTextField uploadsPerHostTF;
    private IntegerTextField returnedSearchLimitTF;
    private JCheckBox allowUploadQueuingChkbx;
    private JLabel queueLimitLabel;
    private IntegerTextField queueLimitTF;
    private JLabel minPollTimeLabel;
    private IntegerTextField minPollTimeTF;
    private JLabel maxPollTimeLabel;
    private IntegerTextField maxPollTimeTF;
    private JCheckBox removeCompletedUploadsChkbx;
    private JCheckBox sharePartialFilesChkbx;
    private JCheckBox allowBrowsingChkbx;

    public SharingPane() {
        super("Sharing");
    }

    /**
     * Called when preparing this settings pane for display the first time. Can
     * be overriden to implement the look of the settings pane.
     */
    @Override
    protected void prepareComponent() {
        FormLayout layout = new FormLayout("10dlu, right:d, 2dlu, d, " + "10dlu, right:d, 2dlu, d, 2dlu:grow", // columns
                "p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 9dlu, " + // rows
                        "p, 3dlu, p, 3dlu, p, 3dlu, p");
        layout.setRowGroups(new int[][] { { 3, 5, 7, 9, 13, 15, 17 } });

        setLayout(layout);

        PanelBuilder builder = new PanelBuilder(layout, this);
        CellConstraints cc = new CellConstraints();
        CellConstraints cc2 = new CellConstraints();

        builder.addSeparator(Localizer.getString("GeneralUploadSettings"), cc.xywh(1, 1, 9, 1));

        simultaneousUploadsTF = new IntegerTextField(UploadPrefs.MaxParallelUploads.get().toString(), 6, 3);
        builder.addLabel(Localizer.getString("MaxParallelUploads") + ": ", cc.xy(2, 3), simultaneousUploadsTF,
                cc2.xy(4, 3));

        uploadsPerHostTF = new IntegerTextField(UploadPrefs.MaxUploadsPerIP.get().toString(), 6, 2);
        builder.addLabel(Localizer.getString("MaxUploadsPerHost") + ": ", cc.xy(6, 3), uploadsPerHostTF,
                cc2.xy(8, 3));

        builder.addLabel(Localizer.getString("MaxReturnedSearchHits") + ": ", cc.xy(2, 5));
        returnedSearchLimitTF = new IntegerTextField(
                String.valueOf(LibraryPrefs.MaxResultsPerQuery.get().toString()), 6, 3);
        builder.add(returnedSearchLimitTF, cc.xy(4, 5));

        allowBrowsingChkbx = new JCheckBox(Localizer.getString("AllowBrowsingDirectories"),
                LibraryPrefs.AllowBrowsing.get().booleanValue());
        builder.add(allowBrowsingChkbx, cc.xywh(2, 7, 3, 1));

        sharePartialFilesChkbx = new JCheckBox(Localizer.getString("SharePartialFiles"),
                UploadPrefs.SharePartialFiles.get().booleanValue());
        builder.add(sharePartialFilesChkbx, cc.xywh(6, 7, 3, 1));

        removeCompletedUploadsChkbx = new JCheckBox(Localizer.getString("AutoCleanFinishedUploads"),
                UploadPrefs.AutoRemoveCompleted.get().booleanValue());
        builder.add(removeCompletedUploadsChkbx, cc.xywh(2, 9, 3, 1));

        builder.addSeparator(Localizer.getString("UploadQueuing"), cc.xywh(1, 11, 9, 1));

        allowUploadQueuingChkbx = new JCheckBox(Localizer.getString("AllowUploadQueuing"),
                UploadPrefs.AllowQueuing.get().booleanValue());
        allowUploadQueuingChkbx.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                refreshEnableState();
            }
        });
        builder.add(allowUploadQueuingChkbx, cc.xywh(2, 13, 4, 1));

        queueLimitLabel = builder.addLabel(Localizer.getString("MaxQueueLength") + ": ", cc.xy(2, 15));
        queueLimitTF = new IntegerTextField(UploadPrefs.MaxQueueSize.get().toString(), 6, 2);
        builder.add(queueLimitTF, cc.xy(4, 15));

        minPollTimeLabel = builder.addLabel(Localizer.getString("MinPollTime") + ": ", cc.xy(2, 17));
        minPollTimeTF = new IntegerTextField(UploadPrefs.MinQueuePollTime.get().toString(), 6, 3);
        builder.add(minPollTimeTF, cc.xy(4, 17));

        maxPollTimeLabel = builder.addLabel(Localizer.getString("MaxPollTime") + ": ", cc.xy(6, 17));
        maxPollTimeTF = new IntegerTextField(UploadPrefs.MaxQueuePollTime.get().toString(), 6, 3);
        builder.add(maxPollTimeTF, cc.xy(8, 17));

        refreshEnableState();
    }

    /**
     * Override this method if you like to verify inputs before storing them.
     * A input dictionary is given to the pane. It can be used to store values
     * like error flags or prepared values for saving. The dictionary is given
     * to every settings pane checkInput(), displayErrorMessage() and
     * saveAndApplyChanges() method.
     * When the input has been flaged as invalid with the method setInputValid()
     * the method displayErrorMessage() is called directly after return of
     * checkInput() and the focus is given to settings pane.
     * After checking all settings pane without any error the method
     * saveAndApplyChanges() is called for all settings panes to save the
     * changes.
     */
    public void checkInput(HashMap inputDic) {
        try {
            String simultaneousUploadsStr = simultaneousUploadsTF.getText();
            Integer simultaneousUploads = Integer.valueOf(simultaneousUploadsStr);
            inputDic.put(SIMULTANEOUS_UPLOADS_KEY, simultaneousUploads);
        } catch (NumberFormatException exp) {
            inputDic.put(NUMBER_FORMAT_ERROR_KEY, simultaneousUploadsTF);
            setInputValid(inputDic, false);
            return;
        }

        try {
            String uploadsPerHostStr = uploadsPerHostTF.getText();
            Integer uploadsPerHost = Integer.valueOf(uploadsPerHostStr);
            inputDic.put(UPLOADS_PER_HOST_KEY, uploadsPerHost);
        } catch (NumberFormatException exp) {
            inputDic.put(NUMBER_FORMAT_ERROR_KEY, uploadsPerHostTF);
            setInputValid(inputDic, false);
            return;
        }

        try {
            String returnedSearchLimitStr = returnedSearchLimitTF.getText();
            Integer returnedSearchLimit = Integer.valueOf(returnedSearchLimitStr);
            if (returnedSearchLimit.intValue() > 255) {
                inputDic.put(SEARCH_HIT_LIMIT_ERROR_KEY, returnedSearchLimit);
                setInputValid(inputDic, false);
                return;
            }
            inputDic.put(RETURNED_SEARCH_LIMIT_KEY, returnedSearchLimit);
        } catch (NumberFormatException exp) {
            inputDic.put(NUMBER_FORMAT_ERROR_KEY, returnedSearchLimitTF);
            setInputValid(inputDic, false);
            return;
        }

        try {
            String queueLimitStr = queueLimitTF.getText();
            Integer queueLimit = Integer.valueOf(queueLimitStr);
            inputDic.put(QUEUE_LIMIT_KEY, queueLimit);
        } catch (NumberFormatException exp) {
            inputDic.put(NUMBER_FORMAT_ERROR_KEY, queueLimitTF);
            setInputValid(inputDic, false);
            return;
        }

        try {
            String minPollTimeStr = minPollTimeTF.getText();
            Integer minPollTime = Integer.valueOf(minPollTimeStr);
            inputDic.put(MIN_POLL_TIME_KEY, minPollTime);
        } catch (NumberFormatException exp) {
            inputDic.put(NUMBER_FORMAT_ERROR_KEY, minPollTimeTF);
            setInputValid(inputDic, false);
            return;
        }

        try {
            String maxPollTimeStr = maxPollTimeTF.getText();
            Integer maxPollTime = Integer.valueOf(maxPollTimeStr);
            inputDic.put(MAX_POLL_TIME_KEY, maxPollTime);
        } catch (NumberFormatException exp) {
            inputDic.put(NUMBER_FORMAT_ERROR_KEY, maxPollTimeTF);
            setInputValid(inputDic, false);
            return;
        }

        setInputValid(inputDic, true);
    }

    /**
     * When isInputValid() returns a false this method is called.
     * The input dictionary should contain the settings pane specific information
     * of the error.
     * The settings pane should override this method to display a error
     * message. Before calling the method the focus is given to the
     * settings pane.
     */
    public void displayErrorMessage(HashMap inputDic) {
        if (inputDic.containsKey(NUMBER_FORMAT_ERROR_KEY)) {
            displayNumberFormatError(inputDic);
        } else if (inputDic.containsKey(SEARCH_HIT_LIMIT_ERROR_KEY)) {
            returnedSearchLimitTF.setText("255");
            returnedSearchLimitTF.requestFocus();
            returnedSearchLimitTF.selectAll();
            GUIUtils.showErrorMessage(Localizer.getString("ExceedSearchHitLimit"), Localizer.getString("Error"));
        }
    }

    /**
     * Override this method if you like to apply and save changes made on
     * settings pane. To trigger saving of the configuration if any value was
     * changed call triggerConfigSave().
     */
    @Override
    public void saveAndApplyChanges(HashMap<String, Object> inputDic) {
        Integer simultaneousUploadsInt = (Integer) inputDic.get(SIMULTANEOUS_UPLOADS_KEY);
        UploadPrefs.MaxParallelUploads.set(simultaneousUploadsInt);

        Integer uploadsPerHostInt = (Integer) inputDic.get(UPLOADS_PER_HOST_KEY);
        UploadPrefs.MaxUploadsPerIP.set(uploadsPerHostInt);

        Integer returnedSearchLimitInt = (Integer) inputDic.get(RETURNED_SEARCH_LIMIT_KEY);
        LibraryPrefs.MaxResultsPerQuery.set(returnedSearchLimitInt);

        boolean allowUploadQueuing = allowUploadQueuingChkbx.isSelected();
        UploadPrefs.AllowQueuing.set(Boolean.valueOf(allowUploadQueuing));

        Integer queueLimitInt = (Integer) inputDic.get(QUEUE_LIMIT_KEY);
        UploadPrefs.MaxQueueSize.set(queueLimitInt);

        // TODO2 should min and max poll time be offered for change??
        // ...maybe... only for advanced users..
        Integer minPollTimeInt = (Integer) inputDic.get(MIN_POLL_TIME_KEY);
        UploadPrefs.MinQueuePollTime.set(minPollTimeInt);

        Integer maxPollTimeInt = (Integer) inputDic.get(MAX_POLL_TIME_KEY);
        UploadPrefs.MaxQueuePollTime.set(maxPollTimeInt);

        boolean sharePartialFiles = sharePartialFilesChkbx.isSelected();
        UploadPrefs.SharePartialFiles.set(Boolean.valueOf(sharePartialFiles));

        boolean removeCompletedUploads = removeCompletedUploadsChkbx.isSelected();
        UploadPrefs.AutoRemoveCompleted.set(Boolean.valueOf(removeCompletedUploads));

        boolean allowBrowsing = allowBrowsingChkbx.isSelected();
        LibraryPrefs.AllowBrowsing.set(Boolean.valueOf(allowBrowsing));
    }

    private void refreshEnableState() {
        boolean enableState = allowUploadQueuingChkbx.isSelected();
        queueLimitLabel.setEnabled(enableState);
        queueLimitTF.setEnabled(enableState);
        minPollTimeLabel.setEnabled(enableState);
        minPollTimeTF.setEnabled(enableState);
        maxPollTimeLabel.setEnabled(enableState);
        maxPollTimeTF.setEnabled(enableState);
    }
}