/******************************************************************************* * See the NOTICE file distributed with this work for additional information * regarding copyright ownership. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package hr.fer.zemris.vhdllab.applets.simulations; import hr.fer.zemris.vhdllab.entity.File; import hr.fer.zemris.vhdllab.platform.manager.editor.impl.AbstractEditor; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Cursor; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.AdjustmentEvent; import java.awt.event.AdjustmentListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionAdapter; import java.awt.event.MouseMotionListener; import java.awt.event.MouseWheelEvent; import java.awt.event.MouseWheelListener; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.DefaultListModel; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JColorChooser; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JScrollBar; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.SwingConstants; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; public class WaveApplet extends AbstractEditor { /** Ovaj container */ protected JPanel cp = null; /** Panel koji sadrzi imena signala */ protected SignalNamesPanel signalNames; /** Panel koji sadrzi trenutne vrijednosti u ovisnosti o polozaju kursora */ protected SignalValuesPanel signalValues; /** Panel na kojem se crtaju valni oblici */ protected WaveDrawBoard waves; /** Panel koji sadrzi skalu */ protected Scale scale; /** * Vertikalni scrollbar koji pomice panel s imenima signala i panel s valnim * oblicima */ protected JScrollBar verticalScrollbar; /** Horizontalni scrollbar pomice panel s valnim oblicima i skalu */ protected JScrollBar horizontalScrollbar; /** Scrollbar koji pomice panel s imenima signala */ protected JScrollBar signalNamesScrollbar; /** Scrollbar koji pomice panel s trenutnim vrijednostima ovisno o kursoru */ protected JScrollBar signalValuesScrollbar; // /** Textfield koji sadrzi tocnu vrijednost na kojoj se nalazi kursor misa // */ // private JTextField textField = new RoundField(10); /** Search signal */ protected JTextField search = new RoundField(10); /** Vremenska razlika izmedu kursora i mouse kursora */ protected JTextField interval = new RoundField(10); /** Panel po kojem se pomice znacka kursora */ protected CursorPanel cursorPanel; /** Popup meni koji sadrzi ikone za pozicioniranje na bridove signala */ protected JPopupMenu popup = new JPopupMenu(); /** Help popup */ protected JPopupMenu popupHelp = new JPopupMenu(); /** Trenutna vrijednost na dvoklik misa */ protected JPopupMenu showValue = new JPopupMenu(); /** Trenutna vrijednost ide u ovaj textField */ /* * Bitno je ovdje ne staviti fiksnu duljinu jer ce paneli gledati tu * duljinu, a ne broj znakova u textFieldu */ protected JTextField currentValue = new JTextField(); /** Sadrzi rezultate simulacije. */ protected GhdlResults results; /** Help panel */ private HelpPanel helpPanel; /** Options popup */ protected JPopupMenu optionsPopup = new JPopupMenu(); /** Divider koji razdvaja panel s imenima signala i trenutnim vrijednostima */ private JPanel divider1 = new JPanel(); /** Divider koji razdvaja panel s trenutnim vrijednostima i valne oblike */ private JPanel divider2 = new JPanel(); /** Sve boje koje se koriste */ protected ThemeColor themeColor = new ThemeColor(); /* ikone */ private Icon navigate = new ImageIcon(getClass().getResource("navigate.png")); private Icon rightUpIcon = new ImageIcon(getClass().getResource("rightUp.PNG")); private Icon rightDownIcon = new ImageIcon(getClass().getResource("rightDown.PNG")); private Icon leftUpIcon = new ImageIcon(getClass().getResource("leftUp.PNG")); private Icon leftDownIcon = new ImageIcon(getClass().getResource("leftDown.PNG")); private Icon zoomInTwoIcon = new ImageIcon(getClass().getResource("+2.png")); private Icon zoomOutTwoIcon = new ImageIcon(getClass().getResource("-2.png")); private Icon zoomInTenIcon = new ImageIcon(getClass().getResource("+10.png")); private Icon zoomOutTenIcon = new ImageIcon(getClass().getResource("-10.png")); private Icon defaultIcon = new ImageIcon(getClass().getResource("default.png")); private Icon upIcon = new ImageIcon(getClass().getResource("up.png")); private Icon downIcon = new ImageIcon(getClass().getResource("down.png")); private Icon helpIcon = new ImageIcon(getClass().getResource("help.png")); private Icon optionsIcon = new ImageIcon(getClass().getResource("options.png")); private Icon gotoIcon = new ImageIcon(getClass().getResource("goto.png")); private Icon gotoPasiveIcon = new ImageIcon(getClass().getResource("gotoPasive.PNG")); /* buttons */ /** Pokazuje popup za trazenje bridova signala */ private JButton navigateSignals = new JButton(navigate); /** Sljedeci rastuci brid */ protected JButton rightUp = new JButton(rightUpIcon); /** Sljedeci padajuci brid */ protected JButton rightDown = new JButton(rightDownIcon); /** Prethodni rastuci brid */ protected JButton leftUp = new JButton(leftUpIcon); /** Prethodni padajuci brid */ protected JButton leftDown = new JButton(leftDownIcon); /* Go to aktivni kursor */ protected JButton gotoButton = new JButton(gotoIcon); /* Go to pasivni kursor */ private JButton gotoPasiveButton = new JButton(gotoPasiveIcon); protected JButton zoomInTwoButton = new JButton(zoomInTwoIcon); protected JButton zoomOutTwoButton = new JButton(zoomOutTwoIcon); protected JButton zoomInTenButton = new JButton(zoomInTenIcon); protected JButton zoomOutTenButton = new JButton(zoomOutTenIcon); /** Vraca defaultni poredak signala */ protected JButton defaultButton = new JButton(defaultIcon); private JButton upButton = new JButton(upIcon); private JButton downButton = new JButton(downIcon); private JButton helpButton = new JButton(helpIcon); private JButton optionsButton = new JButton(optionsIcon); private JButton okButton = new JButton("Ok"); protected JButton defaultTheme = new JButton("DefaultTheme"); private JButton secondTheme = new JButton("SecondTheme"); /* liste */ private DefaultListModel shapes = new DefaultListModel(); protected JList listShapes = new JList(shapes); private DefaultListModel components = new DefaultListModel(); protected JList listComponents = new JList(components); /* color chooser */ protected JColorChooser colorChooser = new JColorChooser(); /* prethodno pritisnuta tipka. Potrebna za kombinaciju dviju tipki */ protected char previousKey = 'A'; /** SerialVersionUID */ private static final long serialVersionUID = 1L; public WaveApplet() { wrapInScrollPane = false; } @Override protected JComponent doInitWithoutData() { cp = new JPanel(new BorderLayout()); // textField.setEditable(false); // textField.setToolTipText("Value"); search.setText("search signal"); search.addMouseListener(searchClickListener); search.addActionListener(searchListener); interval.setText("Interval"); interval.setEditable(false); interval.setToolTipText("Time-interval between cursor and mouse cursor"); /* rezultati prikazni stringom prenose se GhdlResults klasi */ results = new GhdlResults(); /* scrollbars */ signalNamesScrollbar = new JScrollBar(SwingConstants.HORIZONTAL, 0, 0, 0, 0); signalNamesScrollbar.addAdjustmentListener(signalNamesScrollListener); signalValuesScrollbar = new JScrollBar(SwingConstants.HORIZONTAL, 0, 0, 0, 0); signalValuesScrollbar.addAdjustmentListener(signalValuesScrollListener); horizontalScrollbar = new JScrollBar(SwingConstants.HORIZONTAL, 0, 0, 0, 0); horizontalScrollbar.addAdjustmentListener(horizontalScrollListener); /* stvara se skala */ scale = new Scale(horizontalScrollbar, themeColor); /* panel s imenima signala */ signalNames = new SignalNamesPanel(themeColor, signalNamesScrollbar); signalNames.addMouseListener(mouseClickListener); signalNames.addMouseWheelListener(wheelListener); /* vertikalni scrollbar */ verticalScrollbar = new JScrollBar(SwingConstants.VERTICAL, 0, 0, 0, 0); verticalScrollbar.addAdjustmentListener(verticalScrollListener); /* panel s valnim oblicima */ waves = new WaveDrawBoard(scale, signalNames.getSignalNameSpringHeight(), verticalScrollbar, themeColor); waves.addMouseMotionListener(mouseListener); waves.addMouseListener(mouseWaveListener); waves.addMouseWheelListener(wheelListener); /* panel s trenutnim vrijednostima ovisno o kursoru */ signalValues = new SignalValuesPanel(themeColor, signalValuesScrollbar); signalValues.addMouseListener(mouseClickListener); signalValues.addMouseWheelListener(wheelListener); /* panel u kojem klizi kursor */ cursorPanel = new CursorPanel(scale, waves, themeColor); cursorPanel.addMouseMotionListener(mouseListener); cursorPanel.addMouseListener(mouseCursorListener); /* help panel */ helpPanel = new HelpPanel(); /* panel koji razdvaja imena signala i trenutne vrijednosti */ divider1.setPreferredSize(new Dimension(4, 50)); divider1.setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR)); divider1.setBackground(themeColor.getDivider()); divider1.addMouseMotionListener(firstDividerListener); /* panel koji razdvaja trenutne vrijednosti i valne oblike */ divider2.setPreferredSize(new Dimension(4, 50)); divider2.setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR)); divider2.setBackground(themeColor.getDivider()); divider2.addMouseMotionListener(secondDividerListener); /* * Popup prozor koji ce izletjeti na trazenje sljedeceg/prethodnog * padajuceg/rastuceg brid signala. */ rightUp.addActionListener(navigateListener); leftUp.addActionListener(navigateListener); rightDown.addActionListener(navigateListener); leftDown.addActionListener(navigateListener); gotoButton.addActionListener(gotoListener); gotoPasiveButton.addActionListener(gotoListener); rightUp.setToolTipText("Move to next right positive edge"); leftUp.setToolTipText("Move to next left positive edge"); rightDown.setToolTipText("Move to next right negative edge"); leftDown.setToolTipText("Move to next left negative edge"); JPanel buttonPanel = new JPanel(); buttonPanel.setBackground(new Color(141, 176, 221)); buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.LINE_AXIS)); buttonPanel.add(rightUp); buttonPanel.add(leftUp); buttonPanel.add(rightDown); buttonPanel.add(leftDown); buttonPanel.add(gotoButton); buttonPanel.add(gotoPasiveButton); popup.add(buttonPanel); /* kraj popup prozora */ /* Popup koji ce izletjeti na dvoklik u panelu s valnim oblicima */ showValue.setPreferredSize(new Dimension(300, 50)); currentValue.setEditable(false); currentValue.setBackground(themeColor.getSignalNames()); JPanel valuePanel = new JPanel(); valuePanel.setLayout(new BorderLayout()); valuePanel.setBackground(themeColor.getSignalNames()); valuePanel.add(currentValue, BorderLayout.WEST); JScrollPane scrollPane = new JScrollPane(valuePanel); showValue.add(scrollPane); /* kraj popup prozora */ /* toolbar */ JPanel toolbar = new JPanel(); toolbar.setLayout(new BoxLayout(toolbar, BoxLayout.LINE_AXIS)); toolbar.setBackground(new Color(141, 176, 221)); zoomInTwoButton.addActionListener(zoomInTwoListener); zoomOutTwoButton.addActionListener(zoomOutTwoListener); zoomInTenButton.addActionListener(zoomInTenListener); zoomOutTenButton.addActionListener(zoomOutTenListener); defaultButton.addActionListener(defaultOrderListener); upButton.addActionListener(upListener); downButton.addActionListener(downListener); navigateSignals.addActionListener(showNavigation); helpButton.addActionListener(showHelp); optionsButton.addActionListener(showOptions); zoomInTwoButton.setToolTipText("Zoom in by two"); zoomOutTwoButton.setToolTipText("Zoom out by two"); zoomInTenButton.setToolTipText("Zoom in by ten"); zoomOutTenButton.setToolTipText("Zoom out by ten"); defaultButton.setToolTipText("Change to default order"); upButton.setToolTipText("Move signal up"); downButton.setToolTipText("Move signal down"); navigateSignals.setToolTipText("Move to next/previous right/left edge"); optionsButton.setToolTipText("Change current theme/define custom colors"); helpButton.setToolTipText("Help"); toolbar.add(zoomInTwoButton); toolbar.add(zoomOutTwoButton); // toolbar.add(zoomInTenButton); // toolbar.add(zoomOutTenButton); toolbar.add(upButton); toolbar.add(downButton); toolbar.add(defaultButton); toolbar.add(navigateSignals); toolbar.add(optionsButton); toolbar.add(helpButton); /* kraj toolbara */ /* popup help */ popupHelp.setPreferredSize(new Dimension(500, 600)); popupHelp.add(helpPanel); /* popup options */ optionsPopup.setPreferredSize(new Dimension(450, 550)); optionsPopup.setBackground(new Color(238, 238, 238)); JPanel labelPanel = new JPanel(); labelPanel.setLayout(new BoxLayout(labelPanel, BoxLayout.LINE_AXIS)); JLabel titleComponents = new JLabel("Change applet components color:"); JLabel titleShapes = new JLabel("Change Shapes color:"); labelPanel.add(titleComponents); labelPanel.add(Box.createRigidArea(new Dimension(25, 0))); labelPanel.add(titleShapes); labelPanel.add(Box.createRigidArea(new Dimension(358, 0))); JPanel listPanel = new JPanel(); listPanel.setBackground(new Color(238, 238, 238)); listPanel.setLayout(new BoxLayout(listPanel, BoxLayout.LINE_AXIS)); components.addElement("Signal names background"); components.addElement("Waveforms background"); components.addElement("Scale background"); components.addElement("Cursor background"); components.addElement("Active cursor"); components.addElement("Pasive cursor"); components.addElement("Letters color"); shapes.addElement("One"); shapes.addElement("Zero"); shapes.addElement("Unknown"); shapes.addElement("High impedance"); shapes.addElement("U, L, W and H"); shapes.addElement("Bit-vector"); listComponents.addListSelectionListener(listListener); listShapes.addListSelectionListener(listListener); listPanel.add(Box.createRigidArea(new Dimension(7, 0))); listPanel.add(listComponents); listPanel.add(Box.createRigidArea(new Dimension(60, 0))); listPanel.add(listShapes); listPanel.add(Box.createRigidArea(new Dimension(440, 0))); JPanel okPanel = new JPanel(); okPanel.setBackground(new Color(238, 238, 238)); okPanel.setLayout(new BoxLayout(okPanel, BoxLayout.LINE_AXIS)); okButton.addActionListener(okListener); okPanel.add(Box.createRigidArea(new Dimension(5, 0))); okPanel.add(okButton); okPanel.add(Box.createRigidArea(new Dimension(120, 0))); okPanel.add(defaultTheme); defaultTheme.addActionListener(themeListener); okPanel.add(Box.createRigidArea(new Dimension(20, 0))); okPanel.add(secondTheme); secondTheme.addActionListener(themeListener); okPanel.add(Box.createRigidArea(new Dimension(418, 0))); JPanel optionsPanel = new JPanel(); optionsPanel.setBackground(new Color(238, 238, 238)); optionsPanel.setLayout(new BoxLayout(optionsPanel, BoxLayout.PAGE_AXIS)); optionsPanel.add(colorChooser); optionsPanel.add(labelPanel); optionsPanel.add(Box.createRigidArea(new Dimension(0, 10))); optionsPanel.add(listPanel); optionsPanel.add(Box.createRigidArea(new Dimension(0, 20))); optionsPanel.add(okPanel); optionsPanel.add(Box.createRigidArea(new Dimension(0, 5))); optionsPopup.add(optionsPanel); /* kraj popup optionsa */ /* postavljanje komponenti na applet */ cp.setFocusable(true); cp.addKeyListener(keyListener); cp.setLayout(new WaveLayoutManager()); cp.setBackground(themeColor.getSignalNames()); cp.add(toolbar, "toolbar"); // cp.add(textField, "textField"); cp.add(cursorPanel, "cursorPanel"); cp.add(search, "search"); cp.add(interval, "interval"); cp.add(signalNames, "signalNames"); cp.add(divider1, "divider1"); cp.add(divider2, "divider2"); cp.add(signalValues, "signalValues"); cp.add(waves, "waves"); cp.add(scale, "scale"); cp.add(verticalScrollbar, "verticalScrollbar"); cp.add(horizontalScrollbar, "horizontalScrollbar"); cp.add(signalNamesScrollbar, "signalNamesScrollbar"); cp.add(signalValuesScrollbar, "valuesScrollbar"); return cp; } @Override protected void doInitWithData(File f) { /* uzima String preko HTTP-a i predaje ga GHDL parseru */ results.parseString(f.getData()); scale.setContent(results); signalNames.setContent(results); waves.setContent(results); signalValues.setContent(results); cursorPanel.setContent(); helpPanel.setContent(waves.getShapes()); } /** * Listener za vertikalni scrollbar koji pomice panel s valnim oblicima i * panel s imenima signala */ private AdjustmentListener verticalScrollListener = new AdjustmentListener() { /* * Postavlja odgovarajuci offset na temelju trenutne vrijednosti * scrollbara i ponovno crta obje komponente */ public void adjustmentValueChanged(AdjustmentEvent event) { waves.setVerticalOffset(verticalScrollbar.getValue()); signalNames.setVerticalOffset(verticalScrollbar.getValue()); signalValues.setVerticalOffset(verticalScrollbar.getValue()); waves.repaint(); signalNames.repaint(); signalValues.repaint(); } }; /** * Slusa kotacic misa i pomice vertikalni scrollbar */ private MouseWheelListener wheelListener = new MouseWheelListener() { public void mouseWheelMoved(MouseWheelEvent event) { int value = event.getWheelRotation() * 24; verticalScrollbar.setValue(verticalScrollbar.getValue() + value); } }; /** * Listener horizontalnog scrollbara koji scrolla panel s valnim oblicima i * panel sa skalom */ private AdjustmentListener horizontalScrollListener = new AdjustmentListener() { /* * Postavlja odgovarajuci offset na temelju trenutne vrijednosti * scrollbara i ponovno crta obje komponente */ public void adjustmentValueChanged(AdjustmentEvent event) { waves.setHorizontalOffset(horizontalScrollbar.getValue()); scale.setHorizontalOffset(horizontalScrollbar.getValue()); cursorPanel.setOffset(horizontalScrollbar.getValue()); waves.repaint(); scale.repaint(); cursorPanel.repaint(); } }; /** * Listener horizontalnog scrollbara koji scrolla panel s valnim oblicima i * panel sa skalom */ private AdjustmentListener signalNamesScrollListener = new AdjustmentListener() { /** * Postavlja odgovarajuci offset na temelju trenutne vrijednosti * scrollbara i ponovno crta obje komponente */ public void adjustmentValueChanged(AdjustmentEvent event) { signalNames.setHorizontalOffset(signalNamesScrollbar.getValue()); signalNames.repaint(); } }; /** * Listener horizontalnog scrollbara koji scrolla panel s trenutnim * vrijednostim ovisno o polozaju kursora */ private AdjustmentListener signalValuesScrollListener = new AdjustmentListener() { /** * Postavlja odgovarajuci offset na temelju trenutne vrijednosti * scrollbara i ponovno crta obje komponente */ public void adjustmentValueChanged(AdjustmentEvent event) { signalValues.setHorizontalOffset(signalValuesScrollbar.getValue()); signalValues.repaint(); } }; /** * Listener buttona koji pokrece popup prozor */ private ActionListener showNavigation = new ActionListener() { public void actionPerformed(ActionEvent event) { popup.show(cp, 350, 55); /* vraca fokus na kontejner */ cp.requestFocusInWindow(); } }; /** * Otvara help popup */ private ActionListener showHelp = new ActionListener() { public void actionPerformed(ActionEvent event) { popupHelp.show(cp, 200, 55); /* vraca fokus na kontejner */ cp.requestFocusInWindow(); } }; /** * Otvara options popup */ private ActionListener showOptions = new ActionListener() { public void actionPerformed(ActionEvent event) { optionsPopup.show(cp, 420, 55); /* vraca fokus na kontejner */ cp.requestFocusInWindow(); } }; /** * Lista u option panelu */ private ListSelectionListener listListener = new ListSelectionListener() { public void valueChanged(ListSelectionEvent event) { if (event.getSource().equals(listComponents)) { listShapes.clearSelection(); } else { listComponents.clearSelection(); } /* vraca fokus na kontejner */ cp.requestFocusInWindow(); } }; /** * Promjena boje u options panelu */ private ActionListener okListener = new ActionListener() { public void actionPerformed(ActionEvent event) { if (listComponents.isSelectionEmpty() && listShapes.isSelectionEmpty()) { return; } /* postavi index na custom boje */ themeColor.setThemeIndex(0); int index; /* ako je selektirana lista s komponentama */ if (!listComponents.isSelectionEmpty()) { index = listComponents.getSelectedIndex(); switch (index) { case 0 : themeColor.setSignalNames(colorChooser.getColor()); signalNames.repaint(); break; case 1 : themeColor.setWaves(colorChooser.getColor()); waves.repaint(); break; case 2 : themeColor.setScale(colorChooser.getColor()); scale.repaint(); break; case 3 : themeColor.setCursorPanel(colorChooser.getColor()); cursorPanel.repaint(); break; case 4 : themeColor.setActiveCursor(colorChooser.getColor()); waves.repaint(); cursorPanel.repaint(); break; case 5 : themeColor.setPasiveCursor(colorChooser.getColor()); waves.repaint(); cursorPanel.repaint(); break; case 6 : themeColor.setLetters(colorChooser.getColor()); signalNames.repaint(); waves.repaint(); scale.repaint(); cursorPanel.repaint(); break; } } else { index = listShapes.getSelectedIndex(); switch (index) { case 0 : waves.getShapes()[3].setColor(colorChooser.getColor()); waves.getShapes()[4].setColor(colorChooser.getColor()); waves.getShapes()[5].setColor(colorChooser.getColor()); break; case 1 : waves.getShapes()[0].setColor(colorChooser.getColor()); waves.getShapes()[1].setColor(colorChooser.getColor()); waves.getShapes()[2].setColor(colorChooser.getColor()); break; case 2 : waves.getShapes()[12].setColor(colorChooser.getColor()); break; case 3 : waves.getShapes()[9].setColor(colorChooser.getColor()); waves.getShapes()[10].setColor(colorChooser.getColor()); waves.getShapes()[11].setColor(colorChooser.getColor()); break; case 4 : waves.getShapes()[13].setColor(colorChooser.getColor()); waves.getShapes()[14].setColor(colorChooser.getColor()); waves.getShapes()[15].setColor(colorChooser.getColor()); break; case 5 : waves.getShapes()[6].setColor(colorChooser.getColor()); waves.getShapes()[7].setColor(colorChooser.getColor()); waves.getShapes()[8].setColor(colorChooser.getColor()); break; } waves.repaint(); } /* vraca fokus na kontejner */ cp.requestFocusInWindow(); } }; /** * Theme button listener */ private ActionListener themeListener = new ActionListener() { public void actionPerformed(ActionEvent event) { if (event.getSource().equals(defaultTheme)) { themeColor.setThemeIndex(1); } else { themeColor.setThemeIndex(2); } signalNames.repaint(); waves.repaint(); scale.repaint(); signalValues.repaint(); cursorPanel.repaint(); cp.setBackground(themeColor.getSignalNames()); /* vraca fokus na kontejner */ cp.requestFocusInWindow(); } }; /** * Povecava skalu i vrijednost valnih oblika za 10 */ ActionListener zoomInTenListener = new ActionListener() { public void actionPerformed(ActionEvent event) { /* ako je veci od 214748364 prekoracio bi max int */ if (scale.getScaleEndPointInPixels() >= 214748364) { return; } /* postavlja nove vrijednosti i automatski podesava sve parametre */ scale.setDurationsInPixelsAfterZoom(10d); int offset = horizontalScrollbar.getValue(); /* scrollbar ostaje na istom mjestu */ horizontalScrollbar.setValue(offset * 10); cursorPanel .setFirstCursorStartPoint(cursorPanel.getFirstCursorStartPoint() * 10); cursorPanel .setSecondCursorStartPoint(cursorPanel.getSecondCursorStartPoint() * 10); waves.setFirstCursorStartPoint(waves.getFirstCursorStartPoint() * 10); waves.setSecondCursorStartPoint(waves.getSecondCursorStartPoint() * 10); cursorPanel.repaint(); scale.repaint(); waves.repaint(); /* vraca fokus na kontejner */ cp.requestFocusInWindow(); } }; /** * Povecava skalu i vrijednost valnih oblika za 2 */ ActionListener zoomInTwoListener = new ActionListener() { public void actionPerformed(ActionEvent event) { /** Ako je veci od 1073741824, prekoracio bi max int */ if (scale.getScaleEndPointInPixels() >= 1073741824) { return; } /* postavlja nove vrijednosti i automatski podesava sve parametre */ scale.setDurationsInPixelsAfterZoom(2d); int offset = horizontalScrollbar.getValue(); /* scrollbar ostaje na istom mjestu */ horizontalScrollbar.setValue(offset * 2); cursorPanel .setFirstCursorStartPoint(cursorPanel.getFirstCursorStartPoint() * 2); cursorPanel .setSecondCursorStartPoint(cursorPanel.getSecondCursorStartPoint() * 2); waves.setFirstCursorStartPoint(waves.getFirstCursorStartPoint() * 2); waves.setSecondCursorStartPoint(waves.getSecondCursorStartPoint() * 2); cursorPanel.repaint(); scale.repaint(); waves.repaint(); /* vraca fokus na kontejner */ cp.requestFocusInWindow(); } }; /** * Smanjuje skalu i vrijednost valnih oblika za 10 */ ActionListener zoomOutTenListener = new ActionListener() { public void actionPerformed(ActionEvent event) { /* postavlja nove vrijednosti i automatski podesava sve parametre */ scale.setDurationsInPixelsAfterZoom(0.1d); int offset = horizontalScrollbar.getValue(); /* scrollbar ostaje na istom mjestu */ horizontalScrollbar.setValue(offset / 10); cursorPanel .setFirstCursorStartPoint(cursorPanel.getFirstCursorStartPoint() / 10); cursorPanel .setSecondCursorStartPoint(cursorPanel.getSecondCursorStartPoint() / 10); waves.setFirstCursorStartPoint(waves.getFirstCursorStartPoint() / 10); waves.setSecondCursorStartPoint(waves.getSecondCursorStartPoint() / 10); cursorPanel.repaint(); scale.repaint(); waves.repaint(); /* vraca fokus na kontejner */ cp.requestFocusInWindow(); } }; /** * Smanjuje skalu i vrijednost valnih oblika za 2 */ ActionListener zoomOutTwoListener = new ActionListener() { public void actionPerformed(ActionEvent event) { /* postavlja nove vrijednosti i automatski podesava sve parametre */ scale.setDurationsInPixelsAfterZoom(0.5d); int offset = horizontalScrollbar.getValue(); /* scrollbar ostaje na istom mjestu */ horizontalScrollbar.setValue(offset / 2); cursorPanel .setFirstCursorStartPoint(cursorPanel.getFirstCursorStartPoint() / 2); cursorPanel .setSecondCursorStartPoint(cursorPanel.getSecondCursorStartPoint() / 2); waves.setFirstCursorStartPoint(waves.getFirstCursorStartPoint() / 2); waves.setSecondCursorStartPoint(waves.getSecondCursorStartPoint() / 2); cursorPanel.repaint(); scale.repaint(); waves.repaint(); /* vraca fokus na kontejner */ cp.requestFocusInWindow(); } }; /** * Osluskuje 'up' button */ private ActionListener upListener = new ActionListener() { public void actionPerformed(ActionEvent event) { int index = signalNames.getIndex(); boolean isClicked = signalNames.getIsClicked(); /* ako niti jedan signal nije selektiran */ if (!isClicked) { return; } /* promijeni poredak signala prema gore */ index = results.changeSignalOrderUp(index); signalNames.setIndex(index); waves.setIndex(index); signalValues.setIndex(index); /* repainta panel s imenima signala i panel s valnim oblicima */ signalNames.repaint(); waves.repaint(); signalValues.repaint(); if (index * 45 <= signalNames.getVerticalOffset()) { verticalScrollbar.setValue(verticalScrollbar.getValue() - 200); } /* vraca fokus na kontejner */ cp.requestFocusInWindow(); } }; /** * Slusa 'down' button */ private ActionListener downListener = new ActionListener() { public void actionPerformed(ActionEvent event) { int index = signalNames.getIndex(); boolean isClicked = signalNames.getIsClicked(); /* ako niti jedan signal nije selektiran */ if (!isClicked) { return; } /* promijeni poredak signala prema dolje */ index = results.changeSignalOrderDown(index); signalNames.setIndex(index); waves.setIndex(index); signalValues.setIndex(index); /* repainta panel s imenima signala i panel s valnim oblicima */ signalNames.repaint(); waves.repaint(); signalValues.repaint(); if ((index + 1) * 45 + 50 >= signalNames.getHeight() + signalNames.getVerticalOffset()) { verticalScrollbar.setValue(verticalScrollbar.getValue() + 200); } /* vraca fokus na kontejner */ cp.requestFocusInWindow(); } }; /** * slusa 'default' button u popup meniju */ private ActionListener defaultOrderListener = new ActionListener() { public void actionPerformed(ActionEvent event) { /* promijeni natrag na defaultni poredak */ results.setDefaultOrder(); results.setDefaultExpandedSignalNames(); /* postavlja novi objekt imena signala i njihovih vrijednosti */ signalNames.setSignalNames(results.getSignalNames()); waves.setSignalValues(results.getSignalValues()); signalNames.setIndex(0); waves.setIndex(0); signalValues.setIndex(0); /* repainta panel s imenima signala i panel s valnim oblicima */ signalNames.repaint(); waves.repaint(); signalValues.repaint(); /* vraca fokus na kontejner */ cp.requestFocusInWindow(); } }; /** * Mouse listener koji osluskuje pokrete misa i svaki pokret registrira te * na temelju vrijednosti po X-osi i na temelju trenutnog stanja skale vraca * preciznu vrijednost */ private MouseMotionListener mouseListener = new MouseMotionListener() { /** * Metoda koja upravlja eventom */ public void mouseMoved(MouseEvent event) { // /* trenutni offset + X-vrijednost kurosra misa */ // int xValue = event.getX() + horizontalScrollbar.getValue(); // /* podijeljeno s 100 jer je scaleStep za 100 piksela */ // double value = xValue * scale.getScaleStepInTime() / 100; // // textField.setText((Math.round(value * 100000d) / 100000d) + // scale.getMeasureUnitName()); // // /* racuna interval izmedu kursora i trenutne pozicije misa */ // double measuredTime = Math.abs(cursorPanel.getSecondValue() - // cursorPanel.getFirstValue()); // interval.setText((Math.round(measuredTime * 100000d) / 100000d) + // scale.getMeasureUnitName()); // // signalNames.repaint(); } /** * Metoda koja upravlja kursorom */ public void mouseDragged(MouseEvent event) { if (cursorPanel.getActiveCursor() == 1) { waves .setFirstCursorStartPoint(event.getX() + waves.getHorizontalOffset()); cursorPanel.setFirstCursorStartPoint(event.getX() + waves.getHorizontalOffset()); } else { waves.setSecondCursorStartPoint(event.getX() + waves.getHorizontalOffset()); cursorPanel.setSecondCursorStartPoint(event.getX() + waves.getHorizontalOffset()); } int rightBorder = horizontalScrollbar.getValue() + waves.getPanelWidth(); int leftBorder = horizontalScrollbar.getValue(); if (event.getX() + waves.getHorizontalOffset() + 20 >= rightBorder) { horizontalScrollbar.setValue(horizontalScrollbar.getValue() + 20); if (cursorPanel.getActiveCursor() == 1) { cursorPanel.setFirstCursorStartPoint(rightBorder - 20); waves.setFirstCursorStartPoint(rightBorder - 20); } else { cursorPanel.setSecondCursorStartPoint(rightBorder - 20); waves.setSecondCursorStartPoint(rightBorder - 20); } } else if (event.getX() + waves.getHorizontalOffset() < leftBorder && waves.getHorizontalOffset() != 0) { horizontalScrollbar.setValue(horizontalScrollbar.getValue() - 20); if (cursorPanel.getActiveCursor() == 1) { cursorPanel.setFirstCursorStartPoint(leftBorder + 20); waves.setFirstCursorStartPoint(leftBorder + 20); } else { cursorPanel.setSecondCursorStartPoint(leftBorder + 20); waves.setSecondCursorStartPoint(leftBorder + 20); } } /* trenutni offset + X-vrijednost kurosra misa */ int xValue; if (cursorPanel.getActiveCursor() == 1) { xValue = cursorPanel.getFirstCursorStartPoint(); } else { xValue = cursorPanel.getSecondCursorStartPoint(); } /* podijeljeno s 100 jer je scaleStep za 100 piksela */ double value = xValue * scale.getScaleStepInTime() / 100; // textField.setText((Math.round(value * 100000d) / 100000d) + // scale.getMeasureUnitName()); if (value <= 0) { value = 0; } if (cursorPanel.getActiveCursor() == 1) { cursorPanel.setFirstString((Math.round(value * 100000d) / 100000d) + scale.getMeasureUnitName()); cursorPanel.setFirstValue((Math.round(value * 100000d) / 100000d)); } else { cursorPanel.setSecondString((Math.round(value * 100000d) / 100000d) + scale.getMeasureUnitName()); cursorPanel.setSecondValue((Math.round(value * 100000d) / 100000d)); } double measuredTime = Math.abs(cursorPanel.getSecondValue() - cursorPanel.getFirstValue()); interval.setText((Math.round(measuredTime * 100000d) / 100000d) + scale.getMeasureUnitName()); /* trazi trenutni polozaj po tockama promjene */ int index = 0; int transitionPoint = scale.getDurationInPixels()[0]; if (cursorPanel.getActiveCursor() == 1) { while (cursorPanel.getFirstCursorStartPoint() >= transitionPoint) { if (index == results.getSignalValues().get(0).length - 1) { break; } index++; transitionPoint += scale.getDurationInPixels()[index]; } } else { while (cursorPanel.getSecondCursorStartPoint() >= transitionPoint) { if (index == results.getSignalValues().get(0).length - 1) { break; } index++; transitionPoint += scale.getDurationInPixels()[index]; } } signalValues.setValueIndex(index); waves.repaint(); cursorPanel.repaint(); signalValues.repaint(); } }; /** * Mouse listener koji pomice kursor na sljedeci/prethodni padajuci/rastuci * brid */ private ActionListener navigateListener = new ActionListener() { public void actionPerformed(ActionEvent event) { if (signalNames.getIsClicked()) { String presentValue; String previousValue; String nextValue; int index = 0; int valueIndex = 0; int transitionPoint = scale.getDurationInPixels()[0]; boolean isFound = false; if (cursorPanel.getActiveCursor() == 1) { if (cursorPanel.getFirstCursorStartPoint() < transitionPoint) { index = 0; } else { while (cursorPanel.getFirstCursorStartPoint() >= transitionPoint) { index++; if (index >= scale.getDurationInPixels().length) { return; } transitionPoint += scale.getDurationInPixels()[index]; } } } else { if (cursorPanel.getSecondCursorStartPoint() < transitionPoint) { index = 0; signalValues.setValueIndex(index); } else { while (cursorPanel.getSecondCursorStartPoint() >= transitionPoint) { index++; if (index >= scale.getDurationInPixels().length) { return; } transitionPoint += scale.getDurationInPixels()[index]; signalValues.setValueIndex(index); } } } /* ako se trazi prethodni rastuci */ if (event.getSource().equals(leftUp)) { for (; index >= 1;) { presentValue = results.getSignalValues().get( signalNames.getIndex())[index]; previousValue = results.getSignalValues().get( signalNames.getIndex())[--index]; if (presentValue.equals("1") && previousValue.equals("0")) { isFound = true; valueIndex = index; break; } } } /* ako se trazi prethodni padajuci */ else if (event.getSource().equals(leftDown)) { for (; index >= 1;) { presentValue = results.getSignalValues().get( signalNames.getIndex())[index]; previousValue = results.getSignalValues().get( signalNames.getIndex())[--index]; if (presentValue.equals("0") && previousValue.equals("1")) { isFound = true; valueIndex = index; break; } } } /* ako se trazi sljedeci rastuci */ else if (event.getSource().equals(rightUp)) { for (; index < results.getSignalValues().get(0).length - 1; index++) { presentValue = results.getSignalValues().get( signalNames.getIndex())[index]; nextValue = results.getSignalValues().get(signalNames.getIndex())[index + 1]; if (presentValue.equals("0") && nextValue.equals("1")) { isFound = true; valueIndex = index; signalValues.setValueIndex(index); break; } } } /* ako se trazi sljedeci padajuci */ else if (event.getSource().equals(rightDown)) { for (; index < results.getSignalValues().get(0).length - 1; index++) { presentValue = results.getSignalValues().get( signalNames.getIndex())[index]; nextValue = results.getSignalValues().get(signalNames.getIndex())[index + 1]; if (presentValue.equals("1") && nextValue.equals("0")) { isFound = true; valueIndex = index; break; } } } if (isFound) { double value; transitionPoint = 0; for (; index >= 0; index--) { transitionPoint += scale.getDurationInPixels()[index]; } if (cursorPanel.getActiveCursor() == 1) { cursorPanel.setFirstCursorIndex(valueIndex); cursorPanel.setFirstCursorStartPoint(transitionPoint); waves.setFirstCursorStartPoint(transitionPoint); value = transitionPoint * scale.getScaleStepInTime() / 100; cursorPanel .setFirstString((Math.round(value * 100000d) / 100000d) + scale.getMeasureUnitName()); cursorPanel .setFirstValue((Math.round(value * 100000d) / 100000d)); } else { cursorPanel.setSecondCursorIndex(valueIndex); cursorPanel.setSecondCursorStartPoint(transitionPoint); waves.setSecondCursorStartPoint(transitionPoint); value = transitionPoint * scale.getScaleStepInTime() / 100; cursorPanel .setSecondString((Math.round(value * 100000d) / 100000d) + scale.getMeasureUnitName()); cursorPanel .setSecondValue((Math.round(value * 100000d) / 100000d)); } } } cursorPanel.repaint(); waves.repaint(); signalValues.repaint(); /* vraca fokus na kontejner */ cp.requestFocusInWindow(); } }; /** * Mouse listener koji scrolla na aktivni/pasivni kursor */ private ActionListener gotoListener = new ActionListener() { public void actionPerformed(ActionEvent event) { // idi na aktivan if (event.getSource().equals(gotoButton)) { if (cursorPanel.getActiveCursor() == 1) { horizontalScrollbar .setValue(cursorPanel.getFirstCursorStartPoint() - 100); signalValues.setValueIndex(cursorPanel.getFirstCursorIndex()); } else { horizontalScrollbar .setValue(cursorPanel.getSecondCursorStartPoint() - 100); signalValues.setValueIndex(cursorPanel.getSecondCursorIndex()); } } else { if (cursorPanel.getActiveCursor() == 1) { horizontalScrollbar .setValue(cursorPanel.getSecondCursorStartPoint() - 100); signalValues.setValueIndex(cursorPanel.getSecondCursorIndex()); } else { horizontalScrollbar .setValue(cursorPanel.getFirstCursorStartPoint() - 100); signalValues.setValueIndex(cursorPanel.getFirstCursorIndex()); } } cursorPanel.repaint(); waves.repaint(); signalValues.repaint(); /* vraca fokus na kontejner */ cp.requestFocusInWindow(); } }; /** * Mouse listener koji osluskuje klik misa iznad panela s kursorima i na * temelju podrucja klika mijenja aktivni kursor */ private MouseListener mouseCursorListener = new MouseAdapter() { @Override public void mouseClicked(MouseEvent event) { double value = event.getX() + horizontalScrollbar.getValue(); /* provjerava je li kliknut cursor */ if (value >= cursorPanel.getFirstCursorStartPoint() - 5 && value <= cursorPanel.getFirstCursorStartPoint() + 5) { /* postavi prvi kursor aktivnim */ cursorPanel.setActiveCursor((byte)1); waves.setActiveCursor((byte)1); } else if (value >= cursorPanel.getSecondCursorStartPoint() - 5 && value <= cursorPanel.getSecondCursorStartPoint() + 5) { /* postavi drugi kursor aktivnim */ cursorPanel.setActiveCursor((byte)2); waves.setActiveCursor((byte)2); } cursorPanel.repaint(); waves.repaint(); /* vraca fokus na kontejner */ cp.requestFocusInWindow(); } }; /** * Mouse listener koji pomice divider1 i mijenja sirinu panela s imenima * signala */ private MouseMotionListener firstDividerListener = new MouseMotionAdapter() { /** * Mijenja sirinu panela s imenima signala */ @Override public void mouseDragged(MouseEvent event) { if (signalNames.getPanelWidth() <= 5 && event.getX() < 0) { return; } if (signalNames.getPanelWidth() + event.getX() <= 2 || signalNames.getPanelWidth() + event.getX() >= 650) { return; } signalNames.setPanelWidth(event.getX() + signalNames.getPanelWidth()); signalNames.repaint(); cp.doLayout(); } }; /** * Mouse listener koji pomice divider2 i mijenja sirinu panela s trenutnim * vrijednostima */ private MouseMotionListener secondDividerListener = new MouseMotionAdapter() { /** * Mijenja sirinu panela s imenima signala */ @Override public void mouseDragged(MouseEvent event) { if (signalValues.getPanelWidth() <= 5 && event.getX() < 0) { return; } if (signalValues.getPanelWidth() + event.getX() <= 2 || signalValues.getPanelWidth() + event.getX() >= 650) { return; } signalValues.setPanelWidth(event.getX() + signalValues.getPanelWidth()); signalValues.repaint(); cp.doLayout(); } }; /** * Mouse listener koji osluskuje klik misa iznad panela s imenima signala i * panela s trenutnim vrijednostima te na temelju trenutne vrijednosti po * X-osi mijenja background iznad trenutno oznacenog signala */ private MouseListener mouseClickListener = new MouseAdapter() { @Override public void mouseClicked(MouseEvent event) { int mouseButton = event.getButton(); int value = event.getY() + verticalScrollbar.getValue(); int index = 0; if (mouseButton == 1) { /* pronalazi se index signala kojeg treba oznaciti */ while (value % 45 == 0) { value -= 1; } index = value / 45; if (index < results.getCurrentVectorIndex().size()) { /* postavlja se vrijednost suprotna od one koja je do sada bila */ if (waves.getIndex() == index && waves.getIsClicked() == true) { signalNames.setIsClicked(false); waves.setIsClicked(false); signalValues.setIsClicked(false); } else { signalNames.setIsClicked(true); signalNames.setIndex(index); waves.setIsClicked(true); waves.setIndex(index); signalValues.setIsClicked(true); signalValues.setIndex(index); } Integer defaultVectorIndex = results.getCurrentVectorIndex().get(index); /* provjerava je li kliknut plusic na bit-vektoru */ if (defaultVectorIndex != -1 && results.getCurrentVectorIndex().indexOf(defaultVectorIndex) == index && (event.getX() >= 0 && event.getX() <= 15)) { if (!results.getExpandedSignalNames().get(defaultVectorIndex)) { results.getExpandedSignalNames().set(defaultVectorIndex, true); signalNames.expand(index); waves.expand(index); } else { results.getExpandedSignalNames().set(defaultVectorIndex, false); signalNames.collapse(index); waves.collapse(index); } } } } signalNames.repaint(); waves.repaint(); cursorPanel.repaint(); signalValues.repaint(); /* vraca fokus na kontejner */ cp.requestFocusInWindow(); } }; /** * Mouse listener koji osluskuje klik misa iznad panela s valnim oblicima te * na temelju trenutne vrijednosti po X-osi mijenja background iznad * trenutno oznacenog signala */ private MouseListener mouseWaveListener = new MouseAdapter() { @Override public void mouseClicked(MouseEvent event) { int mouseButton = event.getButton(); /* * Ako je kliknuta desna tipka misa, ili srednja tipka misa, * trenutni pasivni kursor ce se pomaknuti tocno na mjesto na kojem * smo kliknuli misem i ostat ce pasivan */ if ((mouseButton == 2 || mouseButton == 3) && event.getClickCount() == 1) { int xValue = event.getX() + horizontalScrollbar.getValue(); double timeValue = xValue * scale.getScaleStepInTime() / 100; if (cursorPanel.getActiveCursor() == 1) { cursorPanel.setSecondCursorStartPoint(xValue); waves.setSecondCursorStartPoint(xValue); cursorPanel .setSecondString((Math.round(timeValue * 100000d) / 100000d) + scale.getMeasureUnitName()); cursorPanel .setSecondValue((Math.round(timeValue * 100000d) / 100000d)); } else { cursorPanel.setFirstCursorStartPoint(xValue); waves.setFirstCursorStartPoint(xValue); cursorPanel .setFirstString((Math.round(timeValue * 100000d) / 100000d) + scale.getMeasureUnitName()); cursorPanel .setFirstValue((Math.round(timeValue * 100000d) / 100000d)); } double measuredTime = Math.abs(cursorPanel.getSecondValue() - cursorPanel.getFirstValue()); interval.setText((Math.round(measuredTime * 100000d) / 100000d) + scale.getMeasureUnitName()); } else if (event.getClickCount() == 2) { int value = event.getY() + verticalScrollbar.getValue(); int index = 0; /* pronalazi se index signala kojeg treba oznaciti */ while (value % 45 == 0) { value -= 1; } index = value / 45; if (index >= results.getSignalValues().size()) { return; } int xValue = event.getX() + horizontalScrollbar.getValue(); int valueIndex = 0; int transitionPoint = scale.getDurationInPixels()[0]; while (xValue >= transitionPoint) { if (valueIndex == results.getSignalValues().get(0).length - 1) { break; } valueIndex++; transitionPoint += scale.getDurationInPixels()[valueIndex]; } showValue.show(cp, 610, 47); currentValue.setText(results.getSignalValues().get(index)[valueIndex]); } signalNames.repaint(); waves.repaint(); cursorPanel.repaint(); signalValues.repaint(); /* vraca fokus na kontejner */ cp.requestFocusInWindow(); } }; /** * Listener koji provjerava je li sto upisano u search */ private ActionListener searchListener = new ActionListener() { public void actionPerformed(ActionEvent e) { String input = search.getText(); boolean isFound = false; int index = 0; /* pretrazivanje imena signala */ for (int i = 0; i < results.getSignalNames().size(); i++) { if (results.getSignalNames().get(i).toLowerCase().equals( input.toLowerCase())) { isFound = true; index = i; break; } } /* ako je nasao */ if (isFound) { signalNames.setIsClicked(true); signalNames.setIndex(index); waves.setIsClicked(true); waves.setIndex(index); verticalScrollbar.setValue(index * 45); } else { search.setText("Not found"); } signalNames.repaint(); waves.repaint(); /* vraca fokus na kontejner */ cp.requestFocusInWindow(); } }; /** * Listener koji resetira search polje kada se klikne na njega */ private MouseListener searchClickListener = new MouseAdapter() { @Override public void mouseClicked(MouseEvent event) { search.setText(""); } }; /** * Key listener */ private KeyListener keyListener = new KeyAdapter() { @Override public void keyTyped(KeyEvent event) { char key = event.getKeyChar(); switch (key) { case '+' : zoomInTwoButton.doClick(); break; case '-' : zoomOutTwoButton.doClick(); break; case 's' : verticalScrollbar.setValue(verticalScrollbar.getValue() + 5); break; case 'w' : verticalScrollbar.setValue(verticalScrollbar.getValue() - 5); break; case 'd' : horizontalScrollbar.setValue(horizontalScrollbar.getValue() + 5); break; case 'a' : horizontalScrollbar.setValue(horizontalScrollbar.getValue() - 5); break; case 'b' : defaultButton.doClick(); break; case 'k' : if (previousKey == 'l') { rightUp.doClick(); } else if (previousKey == 'h') { leftUp.doClick(); } break; case 'j' : if (previousKey == 'l') { rightDown.doClick(); } else if (previousKey == 'h') { leftDown.doClick(); } break; case '(' : zoomInTenButton.doClick(); break; case ')' : zoomOutTenButton.doClick(); break; case 'f' : scale.fitToWindow(); scale.repaint(); waves.repaint(); cursorPanel.repaint(); break; case 'u' : scale.unfitToWindow(); scale.repaint(); waves.repaint(); cursorPanel.repaint(); break; } previousKey = key; } @Override public void keyPressed(KeyEvent event) { int key = event.getKeyCode(); switch (key) { case KeyEvent.VK_UP : verticalScrollbar.setValue(verticalScrollbar.getValue() - 5); break; case KeyEvent.VK_DOWN : verticalScrollbar.setValue(verticalScrollbar.getValue() + 5); break; case KeyEvent.VK_RIGHT : horizontalScrollbar.setValue(horizontalScrollbar.getValue() + 5); break; case KeyEvent.VK_LEFT : horizontalScrollbar.setValue(horizontalScrollbar.getValue() - 5); break; case KeyEvent.VK_HOME : verticalScrollbar.setValue(0); break; case KeyEvent.VK_END : verticalScrollbar.setValue(waves.getPreferredSize().height); break; case KeyEvent.VK_PAGE_UP : verticalScrollbar.setValue(verticalScrollbar.getValue() - signalNames.getPanelHeight()); break; case KeyEvent.VK_PAGE_DOWN : verticalScrollbar.setValue(verticalScrollbar.getValue() + signalNames.getPanelHeight()); break; } } }; @Override protected void doDispose() { } @Override protected String getData() { return null; } }