/* * Copyright (c) 2014 Paul Scherrer Institute. All rights reserved. */ package ch.psi.mxsc; import ch.psi.mxsc.BasePlateGraphics.DrawMode; import ch.psi.pshell.device.Device; import ch.psi.pshell.imaging.Data; import ch.psi.pshell.imaging.ImageListener; import ch.psi.pshell.imaging.Source; import ch.psi.pshell.swing.DevicePanel; import ch.psi.utils.State; import ch.psi.utils.swing.SwingUtils; import java.awt.Point; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; /** * */ public class BasePlatePanel extends DevicePanel { JPopupMenu samplePopupMenu; JMenuItem menuLoadSample; JMenuItem menuUnloadSample; BasePlateGraphics basePlateGraphics; PuckGraphics puckGraphics; boolean TOGGLE_SELECTION = false; /** * Creates new form BasePlatePanel */ public BasePlatePanel() { initComponents(); addMouseListener(mouseAdapter); samplePopupMenu = new JPopupMenu(); menuLoadSample = new JMenuItem("Load"); menuLoadSample.addActionListener((ActionEvent e) -> { try { //getDevice().loadSample(); int sample = clickedSample.getNumber(); int puck = clickedPuck.getNumber(); char segment = clickedPuck.getSegment(); Controller.instance.execute("mount('" + segment + "'," + puck + "," + sample + ")"); } catch (Exception ex) { SwingUtils.showException(this, ex); } }); menuUnloadSample = new JMenuItem("Unload"); menuUnloadSample.addActionListener((ActionEvent e) -> { try { //getDevice().unloadSample(getDevice().getSelectedSample()); int sample = clickedSample.getNumber(); int puck = clickedPuck.getNumber(); char segment = clickedPuck.getSegment(); Controller.instance.execute("unmount('" + segment + "'," + puck + "," + sample + ")"); } catch (Exception ex) { SwingUtils.showException(this, ex); } }); samplePopupMenu.add(menuLoadSample); samplePopupMenu.add(menuUnloadSample); } @Override public BasePlate getDevice() { return (BasePlate) super.getDevice(); } @Override public void setDevice(Device device){ super.setDevice(device); if (mode==Mode.puck){ basePlateGraphics = null; } else { basePlateGraphics = (device==null) ? null : new BasePlateGraphics((BasePlate)device); } } Mode mode = Mode.horizontal; public enum Mode { single, horizontal, vertical, overlapped, puck } public Mode getMode() { return mode; } public void setMode(Mode mode) { this.mode = mode; repaint(); } enum SelectionMode{ Samples, Pucks, None } SelectionMode selectionMode = SelectionMode.None; public SelectionMode getSelectionMode() { return selectionMode; } public void setSelectionMode(SelectionMode selectionMode) { this.selectionMode = selectionMode; } /** * This method is called from within the constructor to initialize the form. WARNING: Do NOT * modify this code. The content of this method is always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // //GEN-BEGIN:initComponents private void initComponents() { javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 400, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 300, Short.MAX_VALUE) ); }// //GEN-END:initComponents @Override protected void onDeviceStateChanged(State state, State former) { repaint(); } Rectangle platePlotRect; Rectangle puckPlotRect; Source source; void createPuckGraphics(){ Puck selectedPuck = getDevice().getSelectedPuck(); if (selectedPuck==null){ puckGraphics=null; } else { if ((puckGraphics==null) || (puckGraphics.puck!= selectedPuck)){ puckGraphics = new PuckGraphics(selectedPuck, null); } } } @Override public void paint(Graphics g) { super.paint(g); if (getDevice() != null) { Graphics2D g2d = (Graphics2D) g; Dimension size = getSize(); if ((size.width > 40) && (size.height > 40)) { int border = 0; int borderPuck = 1; Rectangle plotRect = new Rectangle(border, border, size.width - 2 * border, size.height - 2 * border); Puck selectedPuck = getDevice().getSelectedPuck(); platePlotRect = null; puckPlotRect = null; switch (mode) { case single: platePlotRect = plotRect; puckPlotRect = null; basePlateGraphics.draw(g2d, platePlotRect, (img==null), false, true, DrawMode.center, img); break; case horizontal: platePlotRect = new Rectangle(plotRect.x, plotRect.y, plotRect.width / 2, plotRect.height); basePlateGraphics.draw(g2d, platePlotRect, false, true, true, DrawMode.fill, null); if (selectedPuck!=null){ puckPlotRect = new Rectangle(plotRect.x + plotRect.width / 2 + borderPuck, plotRect.y + borderPuck, plotRect.width / 2 - 2 * borderPuck, plotRect.height - 2 * borderPuck); createPuckGraphics(); puckGraphics.draw(g2d, puckPlotRect, true, false, true); } break; case vertical: platePlotRect = new Rectangle(plotRect.x, plotRect.y, plotRect.width, plotRect.height / 2); basePlateGraphics.draw(g2d, platePlotRect, false, true, true, DrawMode.fill, null); if (selectedPuck!=null){ puckPlotRect = new Rectangle(plotRect.x + borderPuck, plotRect.y + plotRect.height / 2 + borderPuck, plotRect.width - 2 * borderPuck, plotRect.height / 2 - 2 * borderPuck); createPuckGraphics(); puckGraphics.draw(g2d, puckPlotRect, true, false, true); } break; case overlapped: //getDevice().draw(g2d, plotRect, false, true); platePlotRect = new Rectangle(plotRect.x - ((int) (plotRect.width * 0.14)), plotRect.y - ((int) (plotRect.height * 0.14)), (int) (plotRect.width * 1.28), (int) (plotRect.height * 1.28)); basePlateGraphics.draw(g2d, platePlotRect, false, true, false, DrawMode.fill, null); if (selectedPuck!=null){ createPuckGraphics(); int overlappedSize = (int) (1.5 * puckGraphics.getDrawSize()); puckPlotRect = new Rectangle((int) (plotRect.getCenterX() - overlappedSize / 2), (int) (plotRect.getCenterY() - overlappedSize / 2), overlappedSize, overlappedSize); puckGraphics.draw(g2d, puckPlotRect, true, false, true); } break; case puck: if (selectedPuck!=null){ puckPlotRect = new Rectangle(plotRect.x + borderPuck, plotRect.y + borderPuck, plotRect.width - 2 * borderPuck, plotRect.height - 2 * borderPuck); createPuckGraphics(); puckGraphics.draw(g2d, puckPlotRect, true, true, true); } break; } } } } BufferedImage img; ImageListener imageListener = new ImageListener() { @Override public void onImage(Object origin, BufferedImage image, Data data) { img = image; repaint(); } @Override public void onError(Object origin, Exception ex) { img = null; repaint(); } }; void setCameraView(Source source){ img = null; if (this.source!=null){ this.source.removeListener(imageListener); } this.source = source; if (source!=null){ source.addListener(imageListener); } repaint(); } Sample clickedSample; Puck clickedPuck; MouseAdapter mouseAdapter = new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { checkMouseEvent(e, true); } @Override public void mouseReleased(MouseEvent e) { checkMouseEvent(e, false); } private void checkMouseEvent(MouseEvent e, boolean pressed) { if (isEnabled() && (getDevice()!=null)) { try { Sample sample = getSample(e.getX(), e.getY()); Puck puck = getPuck(e.getX(), e.getY()); clickedSample = sample; clickedPuck = puck; if (e.isPopupTrigger()) { if (sample != null) { onSamplePopupMenu(e, sample); } else if (puck != null){ onPuckPopupMenu(e, puck); } else { onBasePlatePopupMenu(e); } } else if ((pressed) && (e.getClickCount() % 2 == 0)) { if (sample != null) { onSampleDoubleClicked(e, sample); } else if (puck != null){ onPuckDoubleClicked(e, puck); } } else if ((e.getButton() == java.awt.event.MouseEvent.BUTTON1)) { if (sample != null) { if (pressed) { onSamplePressed(e, sample); } else { onSampleReleased(e, sample); } }else if (puck != null){ if (pressed) { onPuckPressed(e, puck); } else { onPuckReleased(e, puck); } } else { if (pressed) { onPlatePressed(e); } else { onPlateReleased(e); } } } } catch (Exception ex) { Logger.getLogger(BasePlatePanel.class.getName()).log(Level.WARNING, null, ex); } } } @Override public void mouseClicked(MouseEvent e) { if (isEnabled()&& (getDevice()!=null)) { if (e.getButton() == java.awt.event.MouseEvent.BUTTON1) { Sample sample = getSample(e.getX(), e.getY()); Puck puck = getPuck(e.getX(), e.getY()); if (sample != null) { onSampleClicked(e, sample); } else { onPuckClicked(e, puck); } } } } }; Sample getSample(int x, int y) { Point p = new Point(x, y); if (puckGraphics!=null){ for (SampleGraphics sample :puckGraphics.sampleGraphics){ if (sample.getDrawPosition().distance(p) <= (sample.getDrawSize() / 2)) { return sample.sample; } } } if (basePlateGraphics!=null){ for (PuckGraphics puck : basePlateGraphics.puckGraphics){ if ((mode==Mode.single) || puck.puck.isSelected()){ for (SampleGraphics sample :puck.sampleGraphics){ if (sample.getDrawPosition().distance(p) <= (sample.getDrawSize() / 2)) { return sample.sample; } } } } } return null; } Puck getPuck(int x, int y) { Point p = new Point(x, y); if (puckGraphics!=null){ if (puckGraphics.getDrawPosition().distance(p) <= (puckGraphics.getDrawSize() / 2)) { return puckGraphics.puck; } } if (mode == Mode.puck){ return getDevice().getSelectedPuck(); //Won't de-select it by clicking outside } if (basePlateGraphics!=null){ for (PuckGraphics puck : basePlateGraphics.puckGraphics){ if (puck.getDrawPosition().distance(p) <= (puck.getDrawSize() / 2)) { return puck.puck; } } } return null; } void onSampleClicked(MouseEvent e, Sample sample){ } void selectSample(Sample sample){ if (getSelectionMode()==SelectionMode.Samples){ if (sample!=null){ sample.setSelected(true); } Controller.getInstance().onSamplePressed(sample); repaint(); } } void onSamplePressed(MouseEvent e, Sample sample){ if (getSelectionMode()==SelectionMode.Samples){ if (TOGGLE_SELECTION){ sample.toggleSelected(true); } else { sample.setSelected(true); } repaint(); Controller.getInstance().onSamplePressed(sample); } else if (getSelectionMode()==SelectionMode.Pucks){ onPuckPressed(e, sample.getPuck()); } } void onSampleReleased(MouseEvent e, Sample sample){ } void onSamplePopupMenu(MouseEvent e,Sample sample){ //menuLoadSample.setEnabled(sample.isPresent() && getDevice().getLoadedSample()==null); //menuUnloadSample.setEnabled(!sample.isPresent() && getDevice().getLoadedSample()!=null); menuLoadSample.setEnabled(!sample.isLoaded() && getDevice().getLoadedSample()==null); menuUnloadSample.setEnabled(sample.isLoaded() && getDevice().getLoadedSample()!=null); samplePopupMenu.show(e.getComponent(), e.getX(), e.getY()); } void onSampleDoubleClicked(MouseEvent e,Sample sample){ } void onPuckClicked(MouseEvent e, Puck puck){ } void selectPuck(Puck puck){ if (getSelectionMode()!=SelectionMode.None){ if (puck != null){ puck.setSelected(true); } else { getDevice().resetSelection(); } Controller.getInstance().onPuckPressed(puck); repaint(); } } void onPuckPressed(MouseEvent e, Puck puck){ if (getSelectionMode()!=SelectionMode.None){ if (TOGGLE_SELECTION){ puck.toggleSelected(true); } else { puck.setSelected(true); } repaint(); Controller.getInstance().onPuckPressed(puck); } } void onPuckReleased(MouseEvent e, Puck puck){ Controller.getInstance().onPuckReleased(puck); } void onPlatePressed(MouseEvent e){ if (!TOGGLE_SELECTION){ getDevice().resetSelection(); } Controller.getInstance().onPlatePressed(getDevice()); } void onPlateReleased(MouseEvent e){ Controller.getInstance().onPlateReleased(getDevice()); } void onPuckPopupMenu(MouseEvent e, Puck puck){ } void onPuckDoubleClicked(MouseEvent e, Puck puck){ } void onBasePlatePopupMenu(MouseEvent e){ } // Variables declaration - do not modify//GEN-BEGIN:variables // End of variables declaration//GEN-END:variables }