/******************************************************************************* * 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 java.awt.Dimension; import java.awt.Graphics; import javax.swing.JPanel; import javax.swing.JScrollBar; /** * Panel sadrzi trenutne vrijednosti signala, ovisno o polozaju kursora * * @author Boris Ozegovic */ class SignalValuesPanel extends JPanel { /** Prva vrijednosti pocinje od 30-tog piksela */ private static final int YAXIS_START_POINT = 30; /** Svaka se vrijednost nalazi u springu (elasticnom pretincu) koji je visine 45 piksela */ private static final int SIGNAL_NAME_SPRING_HEIGHT = 45; /** Maksimalna duljina koju panel moze poprimiti iznosi 150 piksela */ private static final int PANEL_MAX_WIDTH = 650; /** Trenutni indeks na kojem je kursor, vrijednost na tom indeksu crta se u panelu */ private int valueIndex; /** Sadrzi rezultate simulacije */ private GhdlResults results; /** Polozaj trenutnog springa */ private int yAxis; /** Trenutni offset po Y-osi */ private int offsetYAxis; /** Trenutni offset po X-osi */ private int offsetXAxis; /** Sirina panela s imenima signala */ private int panelWidth; /** Makimalna duljina vektora, ukoliko postoje vektori */ private int maximumVectorSize; /** Varijabla koja sadrzi informaciju je li trenutni signal oznacen misem */ private boolean isClicked = false; /** Sadrzi indeks trenutno oznacenog signala misem */ private int index = -1; /** Boje */ private ThemeColor themeColor; /** ScrollBar */ private JScrollBar scrollbar; /** SerialVersionUID */ private static final long serialVersionUID = 9; /** * Constructor * * @param themeColor Sve raspolozive boje */ public SignalValuesPanel (ThemeColor themeColor, JScrollBar scrollbar) { super(); this.scrollbar = scrollbar; this.themeColor = themeColor; } /** * Metoda postavlja novo stanje panela s vrijednostima signala u ovisnosti o * rezultatu kojeg vraca GhdlResult * * @param results rezultati koje parsira GhdlResult */ public void setContent(GhdlResults results) { this.results = results; this.maximumVectorSize = results.getMaximumVectorSize(); this.panelWidth = this.maximumVectorSize * 6; } /** * Getter koji vraca preferirane dimenzije */ @Override public Dimension getPreferredSize() { return new Dimension(panelWidth + 4, results.getSignalNames().size() * SIGNAL_NAME_SPRING_HEIGHT); } /** * Getter koji vraca preferirane dimenzije ako je ime najvece duljine manje * od 650 piksela, inace vraca 650 piksela */ @Override public Dimension getMaximumSize() { if (panelWidth < PANEL_MAX_WIDTH) { return new Dimension(panelWidth, results.getSignalNames().size() * SIGNAL_NAME_SPRING_HEIGHT); } return new Dimension(PANEL_MAX_WIDTH, results.getSignalNames().size() * SIGNAL_NAME_SPRING_HEIGHT); } /** * Setter koji postavlja vertikalni offset * * @param offset Zeljeni novi offset */ public void setVerticalOffset (int offset) { this.offsetYAxis = offset; } /** * Vraca trenutni vertikalni offset */ public int getVerticalOffset () { return offsetYAxis; } /** * Setter koji postavlja horizontalni offset * *@param offset Zeljeni novi offset */ public void setHorizontalOffset (int offset) { this.offsetXAxis = offset; } /** * Postavlja informaciju treba li oznaciti signal * * @param isClicked true or false */ public void setIsClicked (boolean isClicked) { this.isClicked = isClicked; } /** * Postavlja trenutni indeks oznacenog signala * * @param index indeks oznacenog signala */ public void setIndex (int index) { this.index = index; } /** * Vraca informaciju je li signal oznacen * * @return true ako je kliknut, inace false */ public boolean getIsClicked () { return isClicked; } /** * Vraca indeks trenutno oznacenog signala * * @return Index kliknutog signala, inace vraca -1 */ public int getIndex () { return index; } /** * Vraca visinu springa u kojoj je smjesteno ime signala */ public int getSignalNameSpringHeight () { return SIGNAL_NAME_SPRING_HEIGHT; } /** * Postavlja indeks vrijednosti na kojoj se trenutno nalazi kursor */ public void setValueIndex (int valueIndex) { this.valueIndex = valueIndex; } /** * Postavlja novu vrijednosti sirine panela * * @param panelWidth nova vrijednost */ public void setPanelWidth (int panelWidth) { this.panelWidth = panelWidth; } /** * Vraca sirinu panela */ public int getPanelWidth () { return panelWidth; } /** * Crta komponentu * * @param g Graphics objekt */ @Override public void paintComponent (Graphics g) { super.paintComponent(g); /* postavi vrijednost scrollbara */ scrollbar.setMaximum(this.getMaximumSize().width); setBackground(themeColor.getSignalNames()); /* ako treba oznaciti neki od signala */ if (isClicked) { g.setColor(themeColor.getApplet()); g.fillRect(0, index * SIGNAL_NAME_SPRING_HEIGHT + 15 - offsetYAxis, getMaximumSize().width, SIGNAL_NAME_SPRING_HEIGHT / 2 + 5); } g.setColor(themeColor.getLetters()); yAxis = YAXIS_START_POINT - offsetYAxis; for (int i = 0; i < results.getSignalValues().size(); i++) { g.drawString(results.getSignalValues().get(i)[valueIndex], 5 - offsetXAxis, yAxis); yAxis += SIGNAL_NAME_SPRING_HEIGHT; } } }