org.dtangler.swingui.mainview.impl.SwingMainView.java Source code

Java tutorial

Introduction

Here is the source code for org.dtangler.swingui.mainview.impl.SwingMainView.java

Source

//This product is provided under the terms of EPL (Eclipse Public License) 
//version 1.0.
//
//The full license text can be read from: http://www.eclipse.org/org/documents/epl-v10.php

package org.dtangler.swingui.mainview.impl;

import java.awt.Component;
import java.awt.Dimension;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTargetAdapter;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.io.File;
import java.io.IOException;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.JToggleButton;
import javax.swing.KeyStroke;
import javax.swing.plaf.basic.BasicSplitPaneUI;

import org.dtangler.core.dependencies.Dependencies;
import org.dtangler.core.dependencies.Scope;
import org.dtangler.core.dependencies.Dependencies.DependencyFilter;
import org.dtangler.swingui.actionfactory.ActionFactory;
import org.dtangler.swingui.actionfactory.ActionKey;
import org.dtangler.swingui.dsm.DsmView;
import org.dtangler.swingui.resource.icons.IconKey;
import org.dtangler.swingui.windowmanager.SwingBaseView;

import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.factories.ButtonBarFactory;
import com.jgoodies.forms.layout.FormLayout;

public class SwingMainView extends SwingBaseView implements MainView {

    public static final String menuItemZoomInNameHeader = "Zoom in (show contents)";
    public static final String menuItemZoomInNameData = "Zoom in (show dependencies)";

    private final JList selectionViolations = new JList();
    private final JList allViolations = new JList();
    private final JButton newButton;
    private final JButton rulesButton;
    private final JButton refreshButton;
    private final DsmView dsmView;
    private final JComboBox scopeCombo = new JComboBox();
    private final JToggleButton shortNameButton;
    private final JMenuItem shortNameMenuItem;
    private String fileName;

    public SwingMainView(ActionFactory actionFactory, DsmView dsmView) {
        super(actionFactory);
        this.dsmView = dsmView;
        newButton = createButton("Input...", Actions.input, IconKey.input24);
        rulesButton = createButton("Rules...", Actions.rules, IconKey.police24);
        refreshButton = createButton("Refresh", Actions.refresh, IconKey.refresh24);
        dsmView.getJComponent().addMouseListener(createDoubleClickAdapter(Actions.zoomInDependencies));
        scopeCombo.addActionListener(getAction(Actions.changeScope));
        selectionViolations.setName("selectionViolations");
        allViolations.setName("allViolations");
        shortNameButton = createToolToggleButton(Actions.toggleShortName, IconKey.shorten16,
                "Show shortened names");
        shortNameMenuItem = createCheckBoxMenuItem("Show shortened names", 'n', Actions.toggleShortName,
                IconKey.shorten16, null);
    }

    private JPopupMenu createPopupMenu(Dependencies.DependencyFilter dependencyFilter) {
        JPopupMenu popupMenu = new JPopupMenu();
        if (dependencyFilter == DependencyFilter.itemsContributingToTheParentDependencyWeight) {
            popupMenu.add(createMenuItem(menuItemZoomInNameData, 'i', Actions.zoomInDependencies, IconKey.zoomin16,
                    null));
        } else {
            popupMenu.add(
                    createMenuItem(menuItemZoomInNameHeader, 'i', Actions.zoomInContents, IconKey.zoomin16, null));
        }
        popupMenu.add(createMenuItem("Zoom out", 'o', Actions.zoomOut, IconKey.zoomout16, null));
        popupMenu.addSeparator();
        popupMenu.add(createMenuItem("Add to forbidden dependencies", 'f', Actions.addforbiddendeps, null));
        return popupMenu;
    }

    protected JComponent buildViewComponent() {
        DefaultFormBuilder builder = new DefaultFormBuilder(
                new FormLayout("fill:10dlu:grow", "fill:10dlu:grow,4dlu,p"));
        builder.setDefaultDialogBorder();
        builder.append(createSplitPane());
        builder.nextRow();
        builder.append(ButtonBarFactory.buildLeftAlignedBar(newButton, rulesButton, refreshButton));
        return builder.getPanel();
    }

    private Component createSplitPane() {
        JSplitPane splitPane = createSplitPane(JSplitPane.VERTICAL_SPLIT, createDsmView(), createViolationsPanel());
        splitPane.setResizeWeight(1);
        splitPane.setDividerLocation(370);
        return splitPane;
    }

    private Component createDsmView() {
        DefaultFormBuilder builder = new DefaultFormBuilder(
                new FormLayout("fill:10dlu:grow", "p,4dlu,fill:10dlu:grow"));
        builder.append(createScopePanel());
        builder.nextRow();
        JScrollPane scrollPane = new JScrollPane(dsmView.getJComponent());
        builder.append(scrollPane);

        JPopupMenu popupMenuForHeaderCells = createPopupMenu(DependencyFilter.none);
        JPopupMenu popupMenuForDataCells = createPopupMenu(
                DependencyFilter.itemsContributingToTheParentDependencyWeight);
        dsmView.setPopupMenuForDataCells(popupMenuForDataCells);
        dsmView.setPopupMenuForHeaderCells(popupMenuForHeaderCells);
        dsmView.refreshPopupMenu();
        scrollPane.setComponentPopupMenu(popupMenuForHeaderCells);

        return builder.getPanel();
    }

    private Component createScopePanel() {
        DefaultFormBuilder builder = new DefaultFormBuilder(
                new FormLayout("p,4dlu,max(60dlu;p),4dlu,20,2dlu,20,4dlu,20", "fill:p"));
        JButton zoomInBtn = createToolButton(Actions.zoomIn, IconKey.zoomin16, "Zoom in onto selection");
        JButton zoomOutBtn = createToolButton(Actions.zoomOut, IconKey.zoomout16, "Zoom out");
        builder.append("Scope");
        builder.append(scopeCombo);
        builder.append(zoomInBtn, zoomOutBtn);
        builder.append(shortNameButton);
        return builder.getPanel();
    }

    private JButton createToolButton(ActionKey actionKey, IconKey iconKey, String tooltipText) {
        JButton btn = new JButton(getAction(actionKey));
        btn.setName(actionKey.name());
        btn.setToolTipText(tooltipText);
        btn.setIcon(getIcon(iconKey));
        btn.setBorder(null);
        btn.setFocusable(false);
        return btn;
    }

    private JToggleButton createToolToggleButton(ActionKey actionKey, IconKey iconKey, String tooltipText) {
        JToggleButton btn = new JToggleButton(getAction(actionKey));
        btn.setName(actionKey.name());
        btn.setToolTipText(tooltipText);
        btn.setIcon(getIcon(iconKey));
        btn.setFocusable(false);
        btn.setBorder(null);
        return btn;
    }

    private JSplitPane createSplitPane(int orientation, Component firstComponent, Component secondComponent) {
        JSplitPane splitpane = new JSplitPane(orientation, firstComponent, secondComponent);
        splitpane.setUI(new BasicSplitPaneUI() {
            public void installUI(JComponent c) {
                super.installUI(c);
                divider.setBorder(null);
            }
        });
        splitpane.setBorder(null);
        return splitpane;
    }

    private Component createViolationsPanel() {
        DefaultFormBuilder builder = new DefaultFormBuilder(new FormLayout("fill:10dlu:grow", "p,fill:30dlu:grow"));
        builder.appendSeparator("Violations");
        builder.append(buildViolationsTabGroup());
        return builder.getPanel();
    }

    private Component buildViolationsTabGroup() {
        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.addTab("All violations", createAllViolationsPanel());
        tabbedPane.addTab("Selected violations", createCellViolationsPanel());
        return tabbedPane;
    }

    private Component createCellViolationsPanel() {
        return new JScrollPane(selectionViolations);
    }

    private Component createAllViolationsPanel() {
        return new JScrollPane(allViolations);
    }

    public void setSelectionViolations(List<String> violations) {
        selectionViolations.setListData(violations.toArray());
    }

    public void setAllViolations(List<String> violations) {
        allViolations.setListData(violations.toArray());
    }

    public Dimension getPreferredSize() {
        return new Dimension(800, 600);
    }

    public String getTitle() {
        StringBuilder sb = new StringBuilder();
        sb.append("DTangler DsmUI");
        if (fileName != null) {
            sb.append(" - ");
            sb.append(fileName);
        }
        return sb.toString();
    }

    public JMenuBar getMenuBar() {
        JMenuBar menuBar = new JMenuBar();
        JMenu fileMenu = menuBar.add(createMenu("File", 'f'));
        fileMenu.add(createMenuItem("New", 'n', Actions.clear,
                KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_DOWN_MASK)));
        fileMenu.add(createMenuItem("Open...", 'o', Actions.open,
                KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_DOWN_MASK)));
        fileMenu.add(createMenuItem("Save", 's', Actions.save,
                KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_DOWN_MASK)));
        fileMenu.add(createMenuItem("Save as...", 'a', Actions.saveas,
                KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.SHIFT_DOWN_MASK | InputEvent.CTRL_DOWN_MASK)));
        fileMenu.addSeparator();
        fileMenu.add(createMenuItem("Exit", 'x', Actions.exit, null));

        JMenu dsmMenu = menuBar.add(createMenu("Model", 'd'));
        dsmMenu.add(createMenuItem("Refresh", 'f', Actions.refresh, KeyStroke.getKeyStroke(KeyEvent.VK_F5, 0)));
        dsmMenu.addSeparator();
        dsmMenu.add(createMenuItem("Dependency input...", 'i', Actions.input,
                KeyStroke.getKeyStroke(KeyEvent.VK_I, InputEvent.CTRL_DOWN_MASK)));
        dsmMenu.add(createMenuItem("Rules...", 'r', Actions.rules,
                KeyStroke.getKeyStroke(KeyEvent.VK_R, InputEvent.CTRL_DOWN_MASK)));

        JMenu viewMenu = menuBar.add(createMenu("View", 'd'));
        viewMenu.add(shortNameMenuItem);
        viewMenu.addSeparator();
        viewMenu.add(createMenuItem("Zoom in onto selection", 'i', Actions.zoomIn, IconKey.zoomin16,
                KeyStroke.getKeyStroke('+')));
        viewMenu.add(createMenuItem("Zoom out", 'o', Actions.zoomOut, IconKey.zoomout16,
                KeyStroke.getKeyStroke('-', 0)));

        JMenu helpMenu = menuBar.add(createMenu("Help", 'h'));
        helpMenu.add(createMenuItem("About dtangler...", 'a', Actions.about, null));

        return menuBar;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
        updateTitle();
    }

    public void setScopes(List<? extends Scope> scopes) {
        // FIXME: not like this!!!
        getAction(Actions.changeScope).setEnabled(false);

        this.scopeCombo.removeAllItems();
        for (Scope scope : scopes)
            this.scopeCombo.addItem(scope);
        getAction(Actions.changeScope).setEnabled(true);
    }

    public void setScope(Scope scope) {
        getAction(Actions.changeScope).setEnabled(false);
        scopeCombo.setSelectedItem(scope);
        getAction(Actions.changeScope).setEnabled(true);
    }

    public Scope getSelectedScope() {
        return (Scope) scopeCombo.getSelectedItem();
    }

    public boolean isShortNameEnabled() {
        return shortNameButton.isSelected();
    }

    public void setShortNameEnabled(boolean b) {
        shortNameButton.setSelected(b);
        shortNameMenuItem.setSelected(b);
    }

    public void addFileListDropListener(final FileListDropListener l) {
        DropTargetAdapter adapter = new DropTargetAdapter() {
            public void drop(DropTargetDropEvent dtde) {
                try {
                    targetDropped(l, dtde);
                } catch (UnsupportedFlavorException e) {
                    throw new RuntimeException(e);
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        };

        addDropTargetListener(adapter);
    }

    private void targetDropped(final FileListDropListener l, DropTargetDropEvent dtde)
            throws UnsupportedFlavorException, IOException {
        Transferable transferable = dtde.getTransferable();
        DataFlavor flavor = transferable.getTransferDataFlavors()[0];
        if (!DataFlavor.javaFileListFlavor.equals(flavor)) {
            dtde.rejectDrop();
            return;
        }
        dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
        onBeforeExecution();
        try {
            List<File> files = (List<File>) transferable.getTransferData(flavor);
            l.fileListDropped(files);
        } finally {
            onAfterExecution();
        }
        dtde.dropComplete(true);
    }
}