All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.hjug.dtangler.swingui.mainview.impl.SwingMainView Maven / Gradle / Ivy

The newest version!
//This product is provided under the terms of EPL (Eclipse Public License) 
//version 2.0.
//
//The full license text can be read from: https://www.eclipse.org/legal/epl-2.0/

package org.hjug.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 java.util.Vector;

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.hjug.dtangler.core.dependencies.Dependencies;
import org.hjug.dtangler.core.dependencies.Scope;
import org.hjug.dtangler.core.dependencies.Dependencies.DependencyFilter;
import org.hjug.dtangler.swingui.actionfactory.ActionFactory;
import org.hjug.dtangler.swingui.actionfactory.ActionKey;
import org.hjug.dtangler.swingui.dsm.DsmView;
import org.hjug.dtangler.swingui.resource.icons.IconKey;
import org.hjug.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 violations) {
		selectionViolations.setListData(new Vector<>(violations));
	}

	public void setAllViolations(List violations) {
		allViolations.setListData(new Vector<>(violations));
	}

	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 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 files = (List) transferable
					.getTransferData(flavor);
			l.fileListDropped(files);
		} finally {
			onAfterExecution();
		}
		dtde.dropComplete(true);
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy