phex.gui.dialogs.filter.AdvSearchRulesDialog.java Source code

Java tutorial

Introduction

Here is the source code for phex.gui.dialogs.filter.AdvSearchRulesDialog.java

Source

/*
 *  PHEX - The pure-java Gnutella-servent.
 *  Copyright (C) 2001 - 2007 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
 * 
 *  Created on 22.11.2005
 *  --- CVS Information ---
 *  $Id$
 */
package phex.gui.dialogs.filter;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.DefaultListCellRenderer;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import phex.common.log.NLogger;
import phex.gui.actions.FWAction;
import phex.gui.actions.FWActionGroup;
import phex.gui.common.DialogBanner;
import phex.gui.common.FWToolBar;
import phex.gui.common.GUIRegistry;
import phex.gui.dialogs.filter.wizard.FilterWizardDialog;
import phex.rules.Rule;
import phex.rules.SearchFilterRules;
import phex.utils.Localizer;

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

public class AdvSearchRulesDialog extends JDialog implements RuleDescOwnerDialog {
    private FWActionGroup actionGroup;
    private SearchFilterRulesEditModel editModel;
    private JList ruleList;
    private RuleDescriptionPanel ruleDescPanel;

    public AdvSearchRulesDialog(SearchFilterRules currentRules) {
        super(GUIRegistry.getInstance().getMainFrame(), Localizer.getString("AdvSearchRules_DialogTitle"), false);
        actionGroup = new FWActionGroup();
        editModel = new SearchFilterRulesEditModel(currentRules);
        prepareComponent();
    }

    private void prepareComponent() {
        CloseEventHandler closeEventHandler = new CloseEventHandler();
        addWindowListener(closeEventHandler);

        Container contentPane = getContentPane();
        contentPane.setLayout(new BorderLayout());

        JPanel contentPanel = new JPanel();
        //JPanel contentPanel = new FormDebugPanel();
        contentPane.add(contentPanel, BorderLayout.CENTER);

        CellConstraints cc = new CellConstraints();
        FormLayout layout = new FormLayout("4dlu, fill:d:grow, 4dlu", // columns
                "p, p, 4dlu, p, p, 8dlu, p, 2dlu, fill:90dlu:grow, 8dlu, fill:p:grow, 12dlu," + // rows
                        "p, 2dlu, p, 4dlu"); //btn rows
        PanelBuilder contentPB = new PanelBuilder(layout, contentPanel);
        int columnCount = layout.getColumnCount();
        int rowCount = layout.getRowCount();

        DialogBanner banner = new DialogBanner(Localizer.getString("AdvSearchRules_BannerHeader"),
                Localizer.getString("AdvSearchRules_BannerSubHeader"));
        contentPB.add(banner, cc.xywh(1, 1, columnCount, 1));

        contentPB.add(new JSeparator(), cc.xywh(1, 2, columnCount, 1));

        FWToolBar ruleBar = new FWToolBar(FWToolBar.HORIZONTAL);
        ruleBar.setBorderPainted(false);
        ruleBar.setFloatable(false);
        ruleBar.setShowText(true);
        contentPB.add(ruleBar, cc.xywh(2, 4, 1, 1));

        contentPB.add(new JSeparator(), cc.xywh(2, 5, 1, 1));

        JLabel label = new JLabel(Localizer.getString("AdvSearchRules_RuleListDescription"));
        contentPB.add(label, cc.xywh(2, 7, 1, 1));

        ruleList = new JList(editModel);
        ruleList.setCellRenderer(new RuleListCellRenderer());
        ruleList.getSelectionModel().addListSelectionListener(new RuleListSelectionListener());
        contentPB.add(new JScrollPane(ruleList), cc.xywh(2, 9, 1, 1));

        ruleDescPanel = new RuleDescriptionPanel(this);
        contentPB.add(ruleDescPanel, cc.xywh(2, 11, 1, 1));

        // button bar
        contentPB.add(new JSeparator(), cc.xywh(1, rowCount - 3, columnCount, 1));

        JButton okBtn = new JButton(Localizer.getString("OK"));
        okBtn.setDefaultCapable(true);
        okBtn.setRequestFocusEnabled(true);
        okBtn.addActionListener(new OkBtnListener());
        JButton cancelBtn = new JButton(Localizer.getString("Cancel"));
        cancelBtn.addActionListener(closeEventHandler);
        JButton applyBtn = new JButton(Localizer.getString("Apply"));
        applyBtn.addActionListener(new ApplyBtnListener());

        JPanel btnPanel = ButtonBarFactory.buildOKCancelApplyBar(okBtn, cancelBtn, applyBtn);
        contentPB.add(btnPanel, cc.xywh(2, rowCount - 1, columnCount - 2, 1));

        setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        getRootPane().setDefaultButton(okBtn);

        // add toolbar actions after all components are initialized to prevent
        // NPE in actions refreshActionState()
        FWAction action = new NewRuleAction();
        actionGroup.addAction(action);
        ruleBar.addAction(action);

        ruleBar.addSeparator();

        action = new ChangeRuleAction();
        actionGroup.addAction(action);
        ruleBar.addAction(action);

        action = new CopyRuleAction();
        actionGroup.addAction(action);
        ruleBar.addAction(action);

        action = new DeleteRuleAction();
        actionGroup.addAction(action);
        ruleBar.addAction(action);

        ruleBar.addSeparator();

        action = new MoveRuleAction(MoveRuleAction.MOVE_UP);
        actionGroup.addAction(action);
        ruleBar.addAction(action);

        action = new MoveRuleAction(MoveRuleAction.MOVE_DOWN);
        actionGroup.addAction(action);
        ruleBar.addAction(action);

        pack();

        int height = getHeight();
        setSize(height * 6 / 5, height);

        setLocationRelativeTo(getParent());
    }

    public Rule getEditRule() {
        int selectedIndex = ruleList.getSelectedIndex();
        if (selectedIndex < 0) {
            return null;
        }
        return editModel.getDisplayRuleAt(selectedIndex);
    }

    private void closeDialog() {
        setVisible(false);
        dispose();
    }

    private class NewRuleAction extends FWAction {
        public NewRuleAction() {
            super(Localizer.getString("AdvSearchRules_NewRule"), null,
                    Localizer.getString("AdvSearchRules_TTTNewRule"));
            refreshActionState();
        }

        public void actionPerformed(ActionEvent e) {
            FilterWizardDialog newFilterDialog = new FilterWizardDialog(AdvSearchRulesDialog.this);
            newFilterDialog.setVisible(true);

            Rule resultRule = newFilterDialog.getEditRule();
            if (resultRule != null) {
                editModel.addNewRule(resultRule);
                actionGroup.refreshActions();
            }
        }

        @Override
        public void refreshActionState() {
        }
    }

    private class CopyRuleAction extends FWAction {
        public CopyRuleAction() {
            super(Localizer.getString("AdvSearchRules_CopyRule"), null,
                    Localizer.getString("AdvSearchRules_TTTCopyRule"));
            refreshActionState();
        }

        public void actionPerformed(ActionEvent e) {
            int selectedIdx = ruleList.getSelectedIndex();
            if (selectedIdx < 0) {
                return;
            }
            Rule modRule = editModel.getDisplayRuleAt(selectedIdx);

            Rule copyRule = (Rule) modRule.clone();
            copyRule.setName(Localizer.getString("RuleVisualization_CopyOf") + " " + modRule.getName());
            // clear the id of a phex internal rule to make it a full user rule.
            copyRule.setId(null);
            // reset possible default flag.
            copyRule.setDefaultRule(false);
            editModel.addNewRule(copyRule);
        }

        @Override
        public void refreshActionState() {
            setEnabled(!ruleList.isSelectionEmpty());
        }
    }

    private class ChangeRuleAction extends FWAction {
        public ChangeRuleAction() {
            super(Localizer.getString("AdvSearchRules_ChangeRule"), null,
                    Localizer.getString("AdvSearchRules_TTTChangeRule"));
            refreshActionState();
        }

        public void actionPerformed(ActionEvent e) {
            int selectedIdx = ruleList.getSelectedIndex();
            if (selectedIdx < 0) {
                return;
            }
            Rule modRule = editModel.getDisplayRuleAt(selectedIdx);
            FilterWizardDialog wizardDialog = new FilterWizardDialog(modRule, AdvSearchRulesDialog.this);
            wizardDialog.setVisible(true);

            Rule resultRule = wizardDialog.getEditRule();
            if (resultRule != null) {
                editModel.updateRule(selectedIdx, resultRule);
            }
            ruleDescPanel.updateRuleData();
        }

        @Override
        public void refreshActionState() {
            setEnabled(!ruleList.isSelectionEmpty());
        }
    }

    private class DeleteRuleAction extends FWAction {
        public DeleteRuleAction() {
            super(Localizer.getString("AdvSearchRules_DeleteRule"), null,
                    Localizer.getString("AdvSearchRules_TTTDeleteRule"));
            refreshActionState();
        }

        public void actionPerformed(ActionEvent e) {
            int selectedIdx = ruleList.getSelectedIndex();
            if (selectedIdx < 0) {
                return;
            }
            editModel.removeRule(selectedIdx);
            ruleDescPanel.updateRuleData();
        }

        @Override
        public void refreshActionState() {
            Rule rule = getEditRule();
            setEnabled(rule != null);
        }
    }

    /**
     * Moves a rule
     */
    class MoveRuleAction extends FWAction {
        private static final boolean MOVE_UP = true;
        private static final boolean MOVE_DOWN = false;

        private boolean moveUp;

        MoveRuleAction(boolean type) {
            super();
            moveUp = type;
            if (moveUp) {
                setSmallIcon(GUIRegistry.getInstance().getPlafIconPack().getIcon("AdvSearchRules.MoveUp"));
                setToolTipText(Localizer.getString("AdvSearchRules_TTTMoveUp"));
            } else {
                setSmallIcon(GUIRegistry.getInstance().getPlafIconPack().getIcon("AdvSearchRules.MoveDown"));
                setToolTipText(Localizer.getString("AdvSearchRules_TTTMoveDown"));
            }
            refreshActionState();
        }

        public void actionPerformed(ActionEvent e) {
            try {
                int selectedIdx = ruleList.getSelectedIndex();
                if (selectedIdx < 0) {
                    return;
                }
                int newIdx = editModel.moveRule(selectedIdx, moveUp);
                ruleList.setSelectedIndex(newIdx);
            } catch (Throwable th) {
                NLogger.error(MoveRuleAction.class, th, th);
            }
        }

        @Override
        public void refreshActionState() {
            int selectedIdx = ruleList.getSelectedIndex();
            if (selectedIdx < 0) {
                setEnabled(false);
            } else if (moveUp && selectedIdx == 0) {
                setEnabled(false);
            } else if (!moveUp && selectedIdx == editModel.getSize() - 1) {
                setEnabled(false);
            } else {
                setEnabled(true);
            }
        }
    }

    private final class ApplyBtnListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            try {
                editModel.applyChangesToQueryManager();
            } catch (Throwable th) {
                NLogger.error(ApplyBtnListener.class, th, th);
            }
        }
    }

    private final class OkBtnListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            try {
                editModel.applyChangesToQueryManager();
                closeDialog();
            } catch (Throwable th) {
                NLogger.error(OkBtnListener.class, th, th);
            }
        }
    }

    private final class CloseEventHandler extends WindowAdapter implements ActionListener {
        @Override
        public void windowClosing(WindowEvent evt) {
            closeDialog();
        }

        /**
         * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
         */
        public void actionPerformed(ActionEvent e) {
            closeDialog();
        }
    }

    public class RuleListSelectionListener implements ListSelectionListener {
        public void valueChanged(ListSelectionEvent e) {
            actionGroup.refreshActions();
            ruleDescPanel.updateRuleData();
        }
    }

    public class RuleListCellRenderer extends DefaultListCellRenderer {

        @Override
        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected,
                boolean cellHasFocus) {
            super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
            if (value instanceof Rule) {
                setText(((Rule) value).getName());
                setToolTipText(((Rule) value).getNotes());
            } else if (value instanceof RuleEditWrapper) {
                setText(((RuleEditWrapper) value).getName());
                setToolTipText(((RuleEditWrapper) value).getModifiedRule().getNotes());
            }
            return this;
        }
    }
}