
org.hjug.dtangler.swingui.mainview.impl.SwingMainView Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of dtangler-swingui Show documentation
Show all versions of dtangler-swingui Show documentation
Directly usable user interface
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);
}
}