com.mebigfatguy.clytemnestra.view.RunStressTestFrame.java Source code

Java tutorial

Introduction

Here is the source code for com.mebigfatguy.clytemnestra.view.RunStressTestFrame.java

Source

/*
 * clytemnastra - a simple gui explorer and stresstool for cassandra
 * Copyright 2011-2012 MeBigFatGuy.com
 * Copyright 2011-2012 Dave Brosius
 *
 * 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.mebigfatguy.clytemnestra.view;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.MouseEvent;
import java.util.EventObject;
import java.util.HashSet;
import java.util.Set;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeCellEditor;

import com.jgoodies.forms.layout.FormLayout;
import com.mebigfatguy.clytemnestra.Bundle;
import com.mebigfatguy.clytemnestra.ColumnType;
import com.mebigfatguy.clytemnestra.Context;
import com.mebigfatguy.clytemnestra.FormHelper;
import com.mebigfatguy.clytemnestra.Pair;
import com.mebigfatguy.clytemnestra.StressTestData.ColumnFamilyData;
import com.mebigfatguy.clytemnestra.StressTestData.ColumnInfo;
import com.mebigfatguy.clytemnestra.StressTestData.KeySpaceData;
import com.mebigfatguy.clytemnestra.actions.CloseStressTestAction;
import com.mebigfatguy.clytemnestra.actions.NewStressTestAction;
import com.mebigfatguy.clytemnestra.actions.OpenStressTestAction;
import com.mebigfatguy.clytemnestra.actions.SaveAsStressTestAction;
import com.mebigfatguy.clytemnestra.actions.SaveStressTestAction;
import com.mebigfatguy.clytemnestra.model.StressTestTreeModel;

public class RunStressTestFrame extends JFrame {

    private static final long serialVersionUID = -5267023846973078444L;
    private Context context;
    private JMenu stressMenu;
    private JMenuItem newStressTestItem;
    private JMenuItem openStressTestItem;
    private JMenuItem closeStressTestItem;
    private JMenuItem saveStressTestItem;
    private JMenuItem saveAsStressTestItem;
    private JTree testConfiguration;
    private JProgressBar insertBar;
    private JProgressBar updateBar;
    private JProgressBar readBar;
    private StressTestTreeModel testModel;
    private JButton runButton;
    private JButton stopButton;

    public RunStressTestFrame(Context ctxt) {
        setTitle(Bundle.getString(Bundle.Key.RunStressTest));
        context = ctxt;
        initComponents();
        initMenus();
        initListeners();
        pack();
    }

    private void initComponents() {
        Container cp = getContentPane();
        cp.setLayout(new BorderLayout(4, 4));
        JSplitPane sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
        cp.add(sp, BorderLayout.CENTER);
        sp.add(createConfigurationPanel());
        sp.add(createRunPanel());
    }

    private JPanel createConfigurationPanel() {
        JPanel p = new JPanel();
        p.setLayout(new BorderLayout(4, 4));

        testModel = new StressTestTreeModel(context.getStressTestData());
        testConfiguration = new JTree(testModel) {
            private static final long serialVersionUID = -253301670769222292L;

            @Override
            public boolean getInvokesStopCellEditing() {
                return true;
            }
        };
        testConfiguration.setRootVisible(false);
        testConfiguration.setShowsRootHandles(true);
        testConfiguration.setEditable(true);
        JScrollPane sp = new JScrollPane(testConfiguration);
        sp.setPreferredSize(new Dimension(500, 200));
        p.add(sp, BorderLayout.CENTER);

        p.setBorder(BorderFactory.createTitledBorder(Bundle.getString(Bundle.Key.TestConfiguration)));
        return p;
    }

    private JPanel createRunPanel() {
        JPanel p = new JPanel();
        p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));

        JPanel progressPanel = new JPanel();

        progressPanel.setLayout(
                new FormLayout("6dlu, pref, 5dlu, pref:grow, 6dlu", "6dlu, pref, 4dlu, pref, 4dlu, pref, 6dlu"));

        insertBar = new JProgressBar(0, 100);
        FormHelper.addFormRow(progressPanel, Bundle.Key.Inserts, insertBar, 2);

        updateBar = new JProgressBar(0, 100);
        FormHelper.addFormRow(progressPanel, Bundle.Key.Updates, updateBar, 4);

        readBar = new JProgressBar(0, 100);
        FormHelper.addFormRow(progressPanel, Bundle.Key.Reads, readBar, 6);

        progressPanel.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10),
                BorderFactory.createTitledBorder(Bundle.getString(Bundle.Key.Status))));

        p.add(progressPanel);

        JPanel ctrlPanel = new JPanel();
        ctrlPanel.setLayout(new BoxLayout(ctrlPanel, BoxLayout.X_AXIS));
        ctrlPanel.add(Box.createHorizontalGlue());

        runButton = new JButton(Bundle.getString(Bundle.Key.RunStressTest));
        ctrlPanel.add(runButton);

        ctrlPanel.add(Box.createHorizontalStrut(10));

        stopButton = new JButton(Bundle.getString(Bundle.Key.StopStressTest));
        stopButton.setEnabled(false);
        ctrlPanel.add(stopButton);

        ctrlPanel.add(Box.createHorizontalStrut(10));

        ctrlPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));

        p.add(ctrlPanel);

        return p;
    }

    private void initMenus() {
        JMenuBar mb = new JMenuBar();
        stressMenu = new JMenu(Bundle.getString(Bundle.Key.StressTest));
        newStressTestItem = new JMenuItem(new NewStressTestAction(context));
        stressMenu.add(newStressTestItem);
        openStressTestItem = new JMenuItem(new OpenStressTestAction(context));
        stressMenu.add(openStressTestItem);
        closeStressTestItem = new JMenuItem(new CloseStressTestAction(context));
        stressMenu.add(closeStressTestItem);
        saveStressTestItem = new JMenuItem(new SaveStressTestAction(context));
        stressMenu.addSeparator();
        stressMenu.add(saveStressTestItem);
        saveAsStressTestItem = new JMenuItem(new SaveAsStressTestAction(context));
        stressMenu.add(saveAsStressTestItem);
        mb.add(stressMenu);

        setJMenuBar(mb);
    }

    private void initListeners() {
        testConfiguration.setCellEditor(new StressCellEditor());
    }

    class StressCellEditor extends JPanel implements TreeCellEditor {

        private static final long serialVersionUID = -2339767146639372346L;
        DefaultTreeCellRenderer renderer;
        JTextField nameEditor;
        JComboBox typeEditor;
        Set<CellEditorListener> listeners = new HashSet<CellEditorListener>();

        public StressCellEditor() {
            renderer = (DefaultTreeCellRenderer) testConfiguration.getCellRenderer();

            setLayout(new BorderLayout(4, 4));
            nameEditor = new JTextField(25);
            typeEditor = new JComboBox(ColumnType.values());
            add(new JLabel(renderer.getLeafIcon()), BorderLayout.WEST);
            add(nameEditor, BorderLayout.CENTER);
            add(typeEditor, BorderLayout.EAST);
        }

        @Override
        public Component getTreeCellEditorComponent(JTree tree, Object value, boolean isSelected, boolean expanded,
                boolean leaf, int row) {

            if (value instanceof KeySpaceData) {
                value = ((KeySpaceData) value).getName();
                remove(typeEditor);
            } else if (value instanceof ColumnFamilyData) {
                value = ((ColumnFamilyData) value).getName();
                remove(typeEditor);
            } else if (value instanceof ColumnInfo) {
                add(typeEditor, BorderLayout.EAST);
                typeEditor.setSelectedItem(((ColumnInfo) value).getType());
                value = ((ColumnInfo) value).getName();
                nameEditor.setText((String) value);
            }

            return this;
        }

        @Override
        public Object getCellEditorValue() {
            return new Pair<String, ColumnType>(nameEditor.getText(), (ColumnType) typeEditor.getSelectedItem());
        }

        @Override
        public boolean isCellEditable(EventObject anEvent) {
            return ((anEvent instanceof MouseEvent) && (((MouseEvent) anEvent).getClickCount() == 2));
        }

        @Override
        public boolean shouldSelectCell(EventObject anEvent) {
            return true;
        }

        @Override
        public boolean stopCellEditing() {
            fireEditingStopped();
            return true;
        }

        @Override
        public void cancelCellEditing() {
            fireEditingStopped();
        }

        @Override
        public void addCellEditorListener(CellEditorListener l) {
            listeners.add(l);
        }

        @Override
        public void removeCellEditorListener(CellEditorListener l) {
            listeners.remove(l);
        }

        private void fireEditingStopped() {
            ChangeEvent ce = new ChangeEvent(this);
            for (CellEditorListener l : listeners) {
                l.editingStopped(ce);
            }
        }
    }
}