package nodebox.client;
import com.google.common.base.Predicates;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import nodebox.handle.Handle;
import nodebox.ui.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
public class ViewerPane extends Pane {
private final static String VIEWER_CARD = "viewer";
private final static String DATA_SHEET_CARD = "data-sheet";
private final NodeBoxDocument document;
private final PaneHeader paneHeader;
private final Viewer viewer;
private final DataSheet dataSheet;
private final NButton handlesCheck, pointsCheck, pointNumbersCheck, originCheck, boundsCheck, renderRootCheck;
private final JPanel contentPanel;
private OutputView currentView;
private Iterable<?> outputValues;
private final PaneTab viewerToggle;
private final PaneTab dataSheetToggle;
public ViewerPane(final NodeBoxDocument document) {
this.document = document;
setLayout(new BorderLayout(0, 0));
contentPanel = new JPanel(new CardLayout());
viewer = new Viewer();
document.addZoomListener(viewer);
currentView = viewer;
dataSheet = new DataSheet();
contentPanel.add(viewer, VIEWER_CARD);
contentPanel.add(dataSheet, DATA_SHEET_CARD);
add(contentPanel, BorderLayout.CENTER);
paneHeader = PaneHeader.withoutTitle();
viewerToggle = new PaneTab(new SwitchCardAction("Viewer", VIEWER_CARD, viewer));
viewerToggle.setFont(Theme.SMALL_FONT);
viewerToggle.setSelected(true);
dataSheetToggle = new PaneTab(new SwitchCardAction("Data", DATA_SHEET_CARD, dataSheet));
paneHeader.add(viewerToggle);
paneHeader.add(dataSheetToggle);
paneHeader.add(new Divider());
handlesCheck = new NButton(NButton.Mode.CHECK, "Handles");
handlesCheck.setChecked(true);
handlesCheck.setActionMethod(this, "toggleHandles");
handlesCheck.setToolTipText("Show/Hide handles");
pointsCheck = new NButton(NButton.Mode.CHECK, "Points");
pointsCheck.setActionMethod(this, "togglePoints");
pointNumbersCheck = new NButton(NButton.Mode.CHECK, "Point Numbers");
pointNumbersCheck.setActionMethod(this, "togglePointNumbers");
originCheck = new NButton(NButton.Mode.CHECK, "Origin");
originCheck.setActionMethod(this, "toggleOrigin");
boundsCheck = new NButton(NButton.Mode.CHECK, "Bounds");
boundsCheck.setActionMethod(this, "toggleBounds");
renderRootCheck = new NButton(NButton.Mode.CHECK, "Render Root");
renderRootCheck.setActionMethod(this, "toggleRenderRoot");
renderRootCheck.setChecked(true);
paneHeader.add(handlesCheck);
paneHeader.add(pointsCheck);
paneHeader.add(pointNumbersCheck);
paneHeader.add(originCheck);
paneHeader.add(boundsCheck);
paneHeader.add(renderRootCheck);
add(paneHeader, BorderLayout.NORTH);
}
public void toggleHandles() {
viewer.setShowHandle(handlesCheck.isChecked());
}
public void togglePoints() {
viewer.setShowPoints(pointsCheck.isChecked());
}
public void togglePointNumbers() {
viewer.setShowPointNumbers(pointNumbersCheck.isChecked());
}
public void setOutputValues(Iterable<?> objects) {
if (objects == null) {
this.outputValues = ImmutableList.of();
currentView.setOutputValues(ImmutableList.of());
} else {
Iterable<?> nonNulls = Iterables.filter(objects, Predicates.notNull());
this.outputValues = ImmutableList.copyOf(nonNulls);
currentView.setOutputValues(ImmutableList.copyOf(this.outputValues));
}
}
public void toggleOrigin() {
viewer.setShowOrigin(originCheck.isChecked());
}
public void toggleBounds() {
viewer.setShowBounds(boundsCheck.isChecked());
}
public void toggleRenderRoot() {
document.requestRender();
}
public boolean shouldAlwaysRenderRoot() {
return renderRootCheck.isChecked();
}
public Pane duplicate() {
return new ViewerPane(document);
}
public PaneHeader getPaneHeader() {
return paneHeader;
}
public PaneView getPaneView() {
return currentView;
}
public DataSheet getDataSheet() {
return dataSheet;
}
public Viewer getViewer() {
return viewer;
}
public Handle getHandle() {
return viewer.getHandle();
}
public void setHandle(Handle handle) {
viewer.setHandle(handle);
}
public void updateHandle() {
viewer.updateHandle();
}
private class SwitchCardAction extends AbstractAction {
private final String viewName;
private final OutputView view;
private SwitchCardAction(String s, String viewName, OutputView view) {
super(s);
this.viewName = viewName;
this.view = view;
}
public void actionPerformed(ActionEvent e) {
CardLayout layout = (CardLayout) contentPanel.getLayout();
layout.show(contentPanel, viewName);
viewerToggle.setSelected(view == viewer);
dataSheetToggle.setSelected(view == dataSheet);
currentView = view;
currentView.setOutputValues(ImmutableList.copyOf(outputValues));
}
}
private final class PaneTab extends JToggleButton {
private PaneTab(Action action) {
super(action);
Dimension d = new Dimension(50, 21);
setMinimumSize(d);
setMaximumSize(d);
setPreferredSize(d);
}
@Override
public void setSelected(boolean selected) {
super.setSelected(selected);
if (selected) {
setBorder(Theme.INNER_SHADOW_BORDER);
} else {
setBorder(Theme.EMPTY_BORDER);
}
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g.setFont(Theme.SMALL_BOLD_FONT);
if (isSelected()) {
g.setColor(Theme.SELECTED_TAB_BACKGROUND_COLOR);
g2.fill(g.getClip());
g.setColor(Theme.TEXT_NORMAL_COLOR);
} else {
g.setColor(Theme.TAB_BACKGROUND_COLOR);
g2.fill(g.getClip());
g.setColor(Theme.TEXT_DISABLED_COLOR);
}
SwingUtils.drawShadowText((Graphics2D) g, getText(), 5, 14);
}
}
}