/** * Setup JOGL canvas, GcodeRenderer and RendererInputHandler. */ /* Copyright 2015-2017 Will Winder This file is part of Universal Gcode Sender (UGS). UGS is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. UGS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with UGS. If not, see <http://www.gnu.org/licenses/>. */ package com.willwinder.ugs.nbm.visualizer; import com.willwinder.ugs.nbm.visualizer.shared.GcodeRenderer; import com.google.common.eventbus.EventBus; import com.jogamp.opengl.GLEventListener; import com.jogamp.opengl.util.FPSAnimator; import com.willwinder.ugs.nbp.lib.lookup.CentralLookup; import com.willwinder.universalgcodesender.model.BackendAPI; import java.awt.BorderLayout; import com.jogamp.opengl.GLCapabilities; import com.jogamp.opengl.awt.GLJPanel; import java.util.prefs.Preferences; import com.willwinder.ugs.nbm.visualizer.options.VisualizerOptionsPanel; import com.willwinder.ugs.nbp.lib.eventbus.HighlightEventBus; import com.willwinder.ugs.nbp.lib.services.LocalizingService; import org.openide.awt.ActionID; import org.openide.awt.ActionReference; import org.openide.util.Lookup; import org.openide.windows.TopComponent; import org.openide.util.NbPreferences; /** * Top component which displays something. */ @TopComponent.Description( preferredID = "Visualizer2TopComponent", //iconBase="SET/PATH/TO/ICON/HERE", persistenceType = TopComponent.PERSISTENCE_ALWAYS ) @TopComponent.Registration(mode = "visualizer", openAtStartup = true) @ActionID(category = LocalizingService.VisualizerCategory, id = LocalizingService.VisualizerActionId) @ActionReference(path = LocalizingService.VisualizerWindowPath) @TopComponent.OpenActionRegistration( displayName = "<Not localized:VisualizerTopComponent>", preferredID = "VisualizerTopComponent" ) public final class Visualizer2TopComponent extends TopComponent { static GLCapabilities glCaps; private GLJPanel panel; private GcodeRenderer renderer; private FPSAnimator animator; private final BackendAPI backend; public Visualizer2TopComponent() { backend = CentralLookup.getDefault().lookup(BackendAPI.class); glCaps = new GLCapabilities(null); setMinimumSize(new java.awt.Dimension(50, 50)); setPreferredSize(new java.awt.Dimension(200, 200)); setLayout(new java.awt.BorderLayout()); } @Override protected void componentOpened() { setName(LocalizingService.VisualizerTitle); setToolTipText(LocalizingService.VisualizerTooltip); super.componentOpened(); panel = makeWindow(glCaps); add(panel, BorderLayout.CENTER); } @Override protected void componentClosed() { super.componentClosed(); System.out.println("Component closed, panel = " + panel); if (panel == null) return; remove(panel); //dispose of panel and native resources panel.destroy(); panel = null; } @Override protected void componentActivated() { super.componentActivated(); if (panel != null) { panel.setSize(getSize()); //need to update complete component tree invalidate(); if (getTopLevelAncestor() != null) { getTopLevelAncestor().invalidate(); getTopLevelAncestor().revalidate(); } } } private GLJPanel makeWindow(final GLCapabilities caps) { final GLJPanel p = new GLJPanel(caps); renderer = Lookup.getDefault().lookup(GcodeRenderer.class); //renderer = new GcodeRenderer(); animator = new FPSAnimator(p, 15); RendererInputHandler rih = new RendererInputHandler(renderer, animator, new VisualizerPopupMenu(backend)); Preferences pref = NbPreferences.forModule(VisualizerOptionsPanel.class); pref.addPreferenceChangeListener(rih); if (backend.getProcessedGcodeFile() != null) { rih.setProcessedGcodeFile(backend.getProcessedGcodeFile().getAbsolutePath()); } else if (backend.getGcodeFile() != null) { rih.setGcodeFile(backend.getGcodeFile().getAbsolutePath()); } // Install listeners... EventBus eb = Lookup.getDefault().lookup(HighlightEventBus.class); if (eb != null) { eb.register(rih); } backend.addControllerListener(rih); backend.addUGSEventListener(rih); // shutdown hook... //frame.addWindowListener(rih); // key listener... p.addKeyListener(rih); // mouse wheel... p.addMouseWheelListener(rih); // mouse motion... p.addMouseMotionListener(rih); // mouse... p.addMouseListener(rih); p.addGLEventListener((GLEventListener) renderer); return p; } void writeProperties(java.util.Properties p) { // better to version settings since initial version as advocated at // http://wiki.apidesign.org/wiki/PropertyFiles p.setProperty("version", "1.0"); // TODO store your settings } void readProperties(java.util.Properties p) { String version = p.getProperty("version"); // TODO read your settings according to their version } }