/*******************************************************************************
* 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.schema2.gui.toolbars.componentproperty;
import hr.fer.zemris.vhdllab.applets.editor.schema2.enums.EPropertyChange;
import hr.fer.zemris.vhdllab.applets.editor.schema2.interfaces.ILocalGuiController;
import hr.fer.zemris.vhdllab.applets.editor.schema2.interfaces.ISchemaComponent;
import hr.fer.zemris.vhdllab.applets.editor.schema2.interfaces.ISchemaComponentCollection;
import hr.fer.zemris.vhdllab.applets.editor.schema2.interfaces.ISchemaController;
import hr.fer.zemris.vhdllab.applets.editor.schema2.interfaces.ISchemaEntity;
import hr.fer.zemris.vhdllab.applets.editor.schema2.interfaces.ISchemaInfo;
import hr.fer.zemris.vhdllab.applets.editor.schema2.interfaces.ISchemaWire;
import hr.fer.zemris.vhdllab.applets.editor.schema2.interfaces.ISchemaWireCollection;
import hr.fer.zemris.vhdllab.applets.editor.schema2.misc.Caseless;
import hr.fer.zemris.vhdllab.applets.schema2.gui.canvas.CanvasToolbarLocalGUIController;
import hr.fer.zemris.vhdllab.applets.schema2.gui.toolbars.componentproperty.SwingComponent.JTableX;
import hr.fer.zemris.vhdllab.applets.schema2.gui.toolbars.componentproperty.SwingComponent.RowEditorModel;
import java.awt.BorderLayout;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class CPToolbar extends JPanel implements PropertyChangeListener {
private static final long serialVersionUID = -6615541360994680172L;
/**
* Sluzi za debug/retail mode ove komponente
*/
public static final boolean DEBUG_MODE = true;
/**
* Ime stupaca tabele
*/
public static final String[] TOOLBAR_TABLE_HEADER = { "Name", "Value" };
/**
* Ponasanje tabele
*/
public static final int TOOLBAR_RESIZE_MODE = JTable.AUTO_RESIZE_ALL_COLUMNS;
/**
* Controller
*/
private ISchemaController controller = null;
/**
* Referenca na lokalni kontroler za komunikaciju canvas<->toolbar
*/
private ILocalGuiController lgc = null;
/**
* Ime oznacene komponente
*/
private JLabel labelComponentName = new JLabel("", JLabel.CENTER);
public CPToolbar(ILocalGuiController lgc, ISchemaController controller) {
this.lgc = lgc;
this.controller = controller;
initGUI();
}
/**
* Inicijalizira graficki dio ovog toolbara
*/
private void initGUI() {
setLayout(new BorderLayout());
printWhenNothingSelected();
}
private void printWhenNothingSelected() {
// labelComponentName.setText("Nothing selected");
// add(labelComponentName, BorderLayout.NORTH);
fetchAndShowEntityProperty();
}
/**
* Graficki prikaz parametara za komponentu ZICA
*
* @param componentName
* ime zice
*/
private void showPropertyForWire(ISchemaWire wire) {
JTableX tabela = null;
if (DEBUG_MODE) {
String componentName = wire.getName().toString();
int numberOfParameters = wire.getParameters().count();
System.out.println("CPToolbar: componentName:" + componentName);
System.out.println("CPToolbar: numberOfParameters:"
+ numberOfParameters);
}
cleanUpGui();
tabela = createJTableForWire(wire);
printComponentName(wire.getName().toString());
faceLiftingForTable(tabela);
printTable(tabela);
validate();
}
/**
* Graficki prikaz za komponentu KOMPONENTA
*
* @param component
* komponenta koja se prikazuje
*/
private void showPropertyForComponent(ISchemaComponent component) {
if (component == null) {
if (DEBUG_MODE) {
System.err.println("CPToolbar: null component provided");
}
cleanUpGui();
return;
}
JTableX tabela = null;
String componentName = component.getName().toString();
if (DEBUG_MODE) {
int numberOfParameters = component.getParameters().count();
System.out.println("CPToolbar: componentName:" + componentName);
System.out.println("CPToolbar: numberOfParameters:"
+ numberOfParameters);
}
cleanUpGui();
tabela = createJTableForComponent(component);
printComponentName(component.getName().toString());
faceLiftingForTable(tabela);
printTable(tabela);
validate();
}
private void faceLiftingForTable(JTableX tabela) {
tabela.setAutoResizeMode(TOOLBAR_RESIZE_MODE);
tabela.setRowSelectionAllowed(false);
tabela.setColumnSelectionAllowed(false);
}
private JTableX createJTableForComponent(ISchemaComponent component) {
// izgenerirani envelope za sve parametre sa svim potrebnim vizualnim
// komponentama
CPToolbarParameterEnvelopeCollection pCollection = new CPToolbarParameterEnvelopeCollection(
component, controller, lgc);
// na temelju envelopea, gradi se model za JTableX
CPToolbarTableModel tableModel = new CPToolbarTableModel(pCollection);
// na temelju envelopea, izgradio se i RowEditor model za JTableX
RowEditorModel rowModel = pCollection.getRowEditorModel();
JTableX tabela = new JTableX(tableModel, rowModel);
return tabela;
}
private JTableX createJTableForWire(ISchemaWire wire) {
// izgenerirani envelope za sve parametre sa svim potrebnim vizualnim
// komponentama
CPToolbarParameterEnvelopeCollection pCollection = new CPToolbarParameterEnvelopeCollection(
wire, controller, lgc);
// na temelju envelopea, gradi se model za JTableX
CPToolbarTableModel tableModel = new CPToolbarTableModel(pCollection);
// na temelju envelopea, izgradio se i RowEditor model za JTableX
RowEditorModel rowModel = pCollection.getRowEditorModel();
JTableX tabela = new JTableX(tableModel, rowModel);
return tabela;
}
private JTableX createJTabbleForEntity(ISchemaEntity entity) {
// izgenerirani envelope za sve parametre sa svim potrebnim vizualnim
// komponentama
CPToolbarParameterEnvelopeCollection pCollection = new CPToolbarParameterEnvelopeCollection(
entity, controller, lgc);
// na temelju envelopea, gradi se model za JTableX
CPToolbarTableModel tableModel = new CPToolbarTableModel(pCollection);
// na temelju envelopea, izgradio se i RowEditor model za JTableX
RowEditorModel rowModel = pCollection.getRowEditorModel();
JTableX tabela = new JTableX(tableModel, rowModel);
return tabela;
}
private void printTable(JTableX tabela) {
JScrollPane sPane = new JScrollPane(tabela);
sPane
.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
sPane
.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
add(sPane, BorderLayout.CENTER);
tabela.setPreferredSize(null);
setPreferredSize(tabela.getPreferredSize());
sPane.invalidate();
}
private void printComponentName(String componentName) {
labelComponentName.setText("Selection: " + componentName);
labelComponentName.setOpaque(true);
add(labelComponentName, BorderLayout.NORTH);
labelComponentName.repaint();
labelComponentName.invalidate();
}
/**
* Sluzi za ciscenje komponente
*/
private void cleanUpGui() {
// makni sve komponente sa panela
removeAll();
repaint();
}
/**
* Registrirani listener
*/
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals(
CanvasToolbarLocalGUIController.PROPERTY_CHANGE_SELECTION)) {
Caseless componentName = null;
componentName = (Caseless) evt.getNewValue();
// dali je komponenta ili zica
if (isWire(lgc.getSelectedType())) {
if (DEBUG_MODE) {
System.out.println("CPToolbar: selectedType=WIRE");
System.out.println("CPToolbar: wireName=" + componentName);
}
fetchAndShowWireProperty(componentName);
} else if (isComponent(lgc.getSelectedType())) {
if (DEBUG_MODE) {
System.out.println("CPToolbar: selectedType=COMPONENT");
System.out.println("CPToolbar: componentName="
+ componentName);
}
fetchAndShowComponentProperty(componentName);
} else if (lgc.getSelectedType() == CanvasToolbarLocalGUIController.TYPE_NOTHING_SELECTED) {
if (DEBUG_MODE) {
System.out.println("CPToolbar: nothingSelected!");
}
cleanUpGui();
printWhenNothingSelected();
}
} else if (evt.getPropertyName().equals(
EPropertyChange.PROPERTY_CHANGE.toString())) {
System.out.println("CPToolbar: selected component:"
+ lgc.getSelectedComponent().toString());
if (isWire(lgc.getSelectedType())) {
fetchAndShowWireProperty(lgc.getSelectedComponent());
} else if (isComponent(lgc.getSelectedType())) {
fetchAndShowComponentProperty(lgc.getSelectedComponent());
}
} else {
if (CPToolbar.DEBUG_MODE) {
System.out.println("CPToolbar: unknow property");
}
}
}
private void fetchAndShowComponentProperty(Caseless componentName) {
if (componentName == null)
return;
ISchemaInfo info = controller.getSchemaInfo();
ISchemaComponentCollection componentCollection = info.getComponents();
ISchemaComponent component = componentCollection
.fetchComponent(componentName);
showPropertyForComponent(component);
}
private void fetchAndShowWireProperty(Caseless componentName) {
if (componentName == null)
return;
ISchemaInfo info = controller.getSchemaInfo();
ISchemaWireCollection wiresCollection = info.getWires();
ISchemaWire wire = wiresCollection.fetchWire(componentName);
if (wire == null) {
if (DEBUG_MODE) {
System.err.println("CPToolbar: fetched wire was null");
}
return;
}
showPropertyForWire(wire);
}
private void fetchAndShowEntityProperty() {
ISchemaInfo info = controller.getSchemaInfo();
ISchemaEntity entity = info.getEntity();
if (entity == null) {
if (DEBUG_MODE) {
System.err.println("CPToolbar: fetched entity was null!");
}
return;
}
showPropertyForEntity(entity);
}
private void showPropertyForEntity(ISchemaEntity entity) {
JTableX tabela = null;
String componentName = entity.getName().toString();
if (DEBUG_MODE) {
int numberOfParameters = entity.getParameters().count();
System.out.println("CPToolbar: entityName:" + componentName);
System.out.println("CPToolbar: numberOfParameters:"
+ numberOfParameters);
}
tabela = createJTabbleForEntity(entity);
printComponentName(componentName);
faceLiftingForTable(tabela);
printTable(tabela);
validate();
}
private boolean isWire(int t) {
if (t == CanvasToolbarLocalGUIController.TYPE_WIRE) {
return true;
}
return false;
}
private boolean isComponent(int t) {
if (t == CanvasToolbarLocalGUIController.TYPE_COMPONENT) {
return true;
}
return false;
}
}