jgnash.ui.account.AccountSecuritiesPanel.java Source code

Java tutorial

Introduction

Here is the source code for jgnash.ui.account.AccountSecuritiesPanel.java

Source

/*
 * jGnash, a personal finance application
 * Copyright (C) 2001-2012 Craig Cavanaugh
 *
 * 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 3 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, see <http://www.gnu.org/licenses/>.
 */
package jgnash.ui.account;

import com.jgoodies.forms.builder.ButtonStackBuilder;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.FormLayout;

import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

import javax.swing.JButton;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListCellRenderer;
import javax.swing.SwingConstants;

import jgnash.engine.Account;
import jgnash.engine.Engine;
import jgnash.engine.EngineFactory;
import jgnash.engine.SecurityNode;
import jgnash.ui.components.SortedListModel;
import jgnash.util.Resource;

/**
 * @author Craig Cavanaugh
 *
 */
class AccountSecuritiesPanel extends JPanel implements ActionListener {

    private Resource rb = Resource.get();

    private Engine engine;

    private JButton addButton;

    private JButton removeButton;

    private JList<SecurityElement> availJList;

    private JList<SecurityElement> selectedJList;

    private SortedListModel<SecurityElement> availModel;

    private SortedListModel<SecurityElement> selectedModel;

    private Account account;

    AccountSecuritiesPanel(final Account account) {
        engine = EngineFactory.getEngine(EngineFactory.DEFAULT);
        this.account = account;
        layoutMainPanel();
    }

    private void initComponents() {
        addButton = new JButton(rb.getString("Button.Add"), Resource.getIcon("/jgnash/resource/list-add.png"));
        addButton.setHorizontalTextPosition(SwingConstants.LEADING);

        removeButton = new JButton(rb.getString("Button.Remove"),
                Resource.getIcon("/jgnash/resource/list-remove.png"));

        availJList = new JList<>();
        selectedJList = new JList<>();

        selectedJList.setCellRenderer(new SecurityRenderer(selectedJList.getCellRenderer()));

        addButton.addActionListener(this);
        removeButton.addActionListener(this);
    }

    private void layoutMainPanel() {
        initComponents();

        FormLayout layout = new FormLayout("75dlu:g(0.5), 8dlu, p, 8dlu, 75dlu:g(0.5)", "");

        DefaultFormBuilder builder = new DefaultFormBuilder(layout, this);

        builder.appendTitle(rb.getString("Title.Available"));
        builder.append("");
        builder.appendTitle(rb.getString("Title.Current"));

        builder.appendRow("f:p:g(1.0)");

        builder.append(new JScrollPane(availJList));
        builder.append(layoutButtonStack());
        builder.append(new JScrollPane(selectedJList));
    }

    private JPanel layoutButtonStack() {
        ButtonStackBuilder builder = new ButtonStackBuilder();

        builder.addGridded(addButton);
        builder.addRelatedGap();
        builder.addGridded(removeButton);
        return builder.getPanel();
    }

    private void addAction() {
        SecurityElement obj = availJList.getSelectedValue();
        if (obj != null) {
            availModel.removeElement(obj);
            selectedModel.addElement(obj);
        }
    }

    private void removeAction() {
        SecurityElement obj = selectedJList.getSelectedValue();
        if (obj != null && obj.enabled) {
            selectedModel.removeElement(obj);
            availModel.addElement(obj);
        }
    }

    public void setSecuritiesList(final Set<SecurityNode> list) {

        selectedModel = new SortedListModel<>();

        if (account != null) {
            Set<SecurityNode> used = account.getUsedSecurities();

            for (SecurityNode node : list) {
                if (used.contains(node)) {
                    selectedModel.addElement(new SecurityElement(node, false));
                } else {
                    selectedModel.addElement(new SecurityElement(node, true));
                }
            }
        } else {
            for (SecurityNode node : list) {
                selectedModel.addElement(new SecurityElement(node, true));
            }
        }

        selectedJList.setModel(selectedModel);
        buildAvailableList();
    }

    public Set<SecurityNode> getSecuritiesList() {

        TreeSet<SecurityNode> set = new TreeSet<>();

        for (SecurityElement e : selectedModel.asList()) {
            set.add(e.getNode());
        }

        return set;
    }

    private void buildAvailableList() {

        List<SecurityElement> list = new ArrayList<>();

        for (SecurityNode node : engine.getSecurities()) {
            list.add(new SecurityElement(node, true));
        }

        ArrayList<SecurityElement> tList = new ArrayList<>();

        for (SecurityElement node : list) {
            if (!selectedModel.contains(node)) {
                tList.add(node);
            }
        }

        availModel = new SortedListModel<>(tList);
        availJList.setModel(availModel);
    }

    @Override
    public void actionPerformed(final ActionEvent e) {
        if (e.getSource() == addButton) {
            addAction();
        } else if (e.getSource() == removeButton) {
            removeAction();
        }
    }

    static final class SecurityElement implements Comparable<SecurityElement> {

        private SecurityNode node;

        private boolean enabled;

        SecurityElement(final SecurityNode node, final boolean enabled) {
            this.node = node;
            this.enabled = enabled;
        }

        public boolean isEnabled() {
            return enabled;
        }

        public SecurityNode getNode() {
            return node;
        }

        @Override
        public String toString() {
            return node.toString();
        }

        @Override
        public int compareTo(final SecurityElement cnode) {
            return node.compareTo(cnode.node);
        }

        @Override
        public int hashCode() {
            return node.hashCode();
        }

        @Override
        public boolean equals(final Object obj) {
            if (obj == null) {
                return false;
            }
            if (getClass() != obj.getClass()) {
                return false;
            }
            final SecurityElement other = (SecurityElement) obj;
            return !(this.node != other.node && (this.node == null || !this.node.equals(other.node)));
        }
    }

    private static final class SecurityRenderer implements ListCellRenderer<SecurityElement> {

        private ListCellRenderer<? super SecurityElement> delegate;

        public SecurityRenderer(final ListCellRenderer<? super SecurityElement> delegate) {
            this.delegate = delegate;
        }

        @Override
        public Component getListCellRendererComponent(final JList<? extends SecurityElement> list,
                final SecurityElement value, final int index, final boolean isSelected, final boolean hasFocus) {
            boolean enabled = value.isEnabled();

            Component c = delegate.getListCellRendererComponent(list, value, index, isSelected, hasFocus);

            c.setEnabled(enabled);
            return c;
        }
    }
}