1185 lines
35 KiB
Java
1185 lines
35 KiB
Java
//This file is part of SECONDO.
|
||
|
||
//Copyright (C) 2004, University in Hagen, Department of Computer Science,
|
||
//Database Systems for New Applications.
|
||
|
||
//SECONDO 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 2 of the License, or
|
||
//(at your option) any later version.
|
||
|
||
//SECONDO 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 SECONDO; if not, write to the Free Software
|
||
//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||
|
||
package viewer;
|
||
|
||
import gui.SecondoObject;
|
||
import sj.lang.*;
|
||
import tools.Reporter;
|
||
|
||
import java.io.*;
|
||
import java.awt.Container;
|
||
import java.awt.Dimension;
|
||
import java.awt.EventQueue;
|
||
import java.awt.GridBagConstraints;
|
||
import java.awt.GridBagLayout;
|
||
import java.awt.Toolkit;
|
||
import java.awt.BorderLayout;
|
||
import java.awt.FlowLayout;
|
||
import java.awt.Color;
|
||
import java.awt.Frame;
|
||
import java.awt.event.*;
|
||
import java.util.Vector;
|
||
import java.util.BitSet;
|
||
import java.util.Iterator;
|
||
|
||
import javax.swing.JComboBox;
|
||
import javax.swing.JEditorPane;
|
||
import javax.swing.JFrame;
|
||
import javax.swing.JPanel;
|
||
import javax.swing.JLabel;
|
||
import javax.swing.JSplitPane;
|
||
import javax.swing.JFormattedTextField;
|
||
import javax.swing.JMenu;
|
||
import javax.swing.JMenuItem;
|
||
import javax.swing.JCheckBoxMenuItem;
|
||
import javax.swing.JTabbedPane;
|
||
import javax.swing.event.ChangeEvent;
|
||
import javax.swing.event.ChangeListener;
|
||
import javax.swing.JColorChooser;
|
||
import javax.swing.JTabbedPane;
|
||
|
||
import java.text.DecimalFormat;
|
||
import java.beans.PropertyChangeEvent;
|
||
import java.beans.PropertyChangeListener;
|
||
|
||
import javax.vecmath.*;
|
||
|
||
import com.sun.j3d.utils.geometry.*;
|
||
import com.sun.j3d.utils.universe.*;
|
||
|
||
import javax.media.j3d.*;
|
||
|
||
import com.sun.j3d.utils.behaviors.vp.*;
|
||
import com.sun.j3d.utils.pickfast.behaviors.*;
|
||
|
||
import viewer.spatial3D.*;
|
||
|
||
|
||
/**
|
||
* this is a viewer for single and relations of spatial 3D objects
|
||
* this viewer displays objects from relations also in an textual representation
|
||
*/
|
||
public class Spatial3DViewer extends SecondoViewer {
|
||
|
||
private enum AllowedObjects {point3d,surface3d,vector3d,volume3d,pointcloud}; //can be changed according to development of algebra
|
||
|
||
private JTabbedPane configPane;
|
||
private JComboBox itemsNameBox;
|
||
private Vector<ObjectGroup> itemsObject = new Vector<ObjectGroup>(10, 5);
|
||
private JSplitPane splitPane;
|
||
|
||
private JPanel graphicPanel;
|
||
private JPanel boxPanel;
|
||
|
||
JLabel scaleFactorLabel=new JLabel("Scale Factor:");
|
||
private JFormattedTextField scaleFactorField = new JFormattedTextField(new DecimalFormat());
|
||
|
||
private SecondoObject currentObject;
|
||
|
||
private Canvas3D canvas;
|
||
private SimpleUniverse universe;
|
||
private int coordIndices[];
|
||
private BranchGroup rootScene;
|
||
|
||
// lighting
|
||
private BranchGroup lights;
|
||
private BranchGroup ambLightBg;
|
||
|
||
//Dialogs
|
||
private ScaleFactorDialog scaleFactorDialog;
|
||
private ZoomFactorDialog zoomfactorDialog;
|
||
private TranslateFactorDialog translateFactorDialog;
|
||
private RotateFactorDialog rotateFactorDialog;
|
||
private SetPointSizeDialog setPointSizeDialog;
|
||
|
||
//Textview
|
||
private TextWindow textWindow;
|
||
|
||
//menus
|
||
private MenuVector MenuExtension = new MenuVector();
|
||
private JMenu settingsMenu;
|
||
private JMenuItem menuItem_Scale;
|
||
private JCheckBoxMenuItem menuItem_ScaleView;
|
||
private JMenuItem menuItem_Zoom;
|
||
private JMenuItem menuItem_Translate;
|
||
private JMenuItem menuItem_Rotate;
|
||
private JMenuItem menuItem_setPointSize;
|
||
private JMenu appearanceMenu;
|
||
private JCheckBoxMenuItem menuItem_GridView;
|
||
private JCheckBoxMenuItem menuItem_varyingColorView;
|
||
private JMenu setColorsMenu;
|
||
private JMenuItem menuItem_setBackgroundColor;
|
||
private JMenuItem menuItem_setGridColor;
|
||
private JMenuItem menuItem_setObjectColor;
|
||
private JMenu setDefaultColorsMenu;
|
||
private JMenuItem menuItem_setDefaultBackgroundColor;
|
||
private JMenuItem menuItem_setDefaultGridColor;
|
||
private JMenuItem menuItem_setDefaultObjectColor;
|
||
private JMenu viewMenu;
|
||
private JMenuItem menuItem_centerView;
|
||
private JMenuItem menuItem_resetView;
|
||
private boolean showScaleMenu = false;
|
||
|
||
private float pointSize =10.0f;
|
||
private float singlePointSize;
|
||
|
||
private ObjectGroup objectGroup;
|
||
private ObjectGroup dummy;
|
||
|
||
private boolean colorChanged;
|
||
|
||
private OrbitBehavior ob;
|
||
private Transform3D home = new Transform3D();
|
||
|
||
/**
|
||
* Creates a MainWindow with all its components
|
||
*/
|
||
public Spatial3DViewer(){
|
||
|
||
try{
|
||
|
||
this.setLayout(new BorderLayout());
|
||
|
||
// TextPanel
|
||
textWindow = new TextWindow(this);
|
||
configPane = new JTabbedPane();
|
||
configPane.addTab("Text", textWindow);
|
||
|
||
// combobox items
|
||
itemsNameBox = new JComboBox();
|
||
itemsNameBox.addActionListener(new ActionListener(){
|
||
public void actionPerformed(ActionEvent evt){
|
||
if(VC !=null){ // VC..ViewerControl
|
||
int index = itemsNameBox.getSelectedIndex();
|
||
if (index>=0){
|
||
try{
|
||
objectGroup=itemsObject.get(index);
|
||
currentObject = objectGroup.getSecondoObject() ;
|
||
VC.selectObject(Spatial3DViewer.this,currentObject);
|
||
showObjectGroup();
|
||
}
|
||
catch(Exception e){
|
||
Reporter.writeError("Error in addActionListener= " + e.getStackTrace());
|
||
Reporter.writeError("Error in addActionListener= " + e.getClass() + " - "
|
||
+ e.getMessage()+" - "+ e.getCause() );
|
||
}
|
||
}
|
||
}
|
||
}});
|
||
|
||
JLabel itemsNameBoxLabel = new JLabel("Item name:");
|
||
|
||
itemsNameBox.setLightWeightPopupEnabled(false);
|
||
itemsNameBox.setPreferredSize(new Dimension(230,itemsNameBox.getPreferredSize().height));
|
||
|
||
boxPanel = new JPanel();
|
||
boxPanel.setLayout(new FlowLayout());
|
||
boxPanel.add(itemsNameBoxLabel);
|
||
boxPanel.add(itemsNameBox);
|
||
|
||
// 3D Graphic pane
|
||
graphicPanel = new JPanel();
|
||
graphicPanel.setLayout(new BorderLayout());
|
||
|
||
//create Canvas and put it on GraphicPane
|
||
canvas= new Canvas3D(SimpleUniverse.getPreferredConfiguration());
|
||
|
||
//set universe
|
||
universe = new SimpleUniverse(canvas);
|
||
//standardposition of viewer
|
||
universe.getViewingPlatform().setNominalViewingTransform();
|
||
//set root Scene
|
||
rootScene = new BranchGroup();
|
||
rootScene.setCapability(BranchGroup.ALLOW_DETACH);
|
||
|
||
// Lighting
|
||
ambLightBg = new BranchGroup();
|
||
ambLightBg.setCapability(BranchGroup.ALLOW_DETACH);
|
||
lights = new BranchGroup();
|
||
lights.setCapability(BranchGroup.ALLOW_DETACH);
|
||
|
||
//set back clip distance
|
||
try{
|
||
canvas.getView().setBackClipDistance(100);
|
||
}
|
||
catch (NullPointerException e) {
|
||
Reporter.writeError("canvas=null. Can not setBackClipDistance!");
|
||
}
|
||
|
||
//set panels
|
||
graphicPanel.add(boxPanel,BorderLayout.NORTH);
|
||
graphicPanel.add(canvas,BorderLayout.CENTER);
|
||
graphicPanel.setMinimumSize(new Dimension(100,50));
|
||
|
||
splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,configPane,graphicPanel);
|
||
splitPane.setOneTouchExpandable(true);
|
||
splitPane.setDividerLocation(230);
|
||
|
||
this.add(splitPane,BorderLayout.CENTER);
|
||
|
||
// set a dummy objectGroup to avoid nullPointerException
|
||
dummy = new ObjectGroup(null, canvas, this);
|
||
objectGroup=dummy;
|
||
createMenuExtension();
|
||
|
||
// disable menü
|
||
settingsMenu.setEnabled(false);
|
||
appearanceMenu.setEnabled(false);
|
||
viewMenu.setEnabled(false);
|
||
} catch(Exception e){
|
||
e.printStackTrace();
|
||
}
|
||
|
||
|
||
}
|
||
|
||
/**
|
||
* getName
|
||
* @return the name of this viewer
|
||
*/
|
||
public String getName(){
|
||
return "Spatial3DViewer";
|
||
}
|
||
|
||
/**
|
||
* addObject
|
||
* add the Secondo object
|
||
* @param o This Method analyse the value o
|
||
* @return true if the object could display
|
||
*/
|
||
public boolean addObject(SecondoObject o){
|
||
if (!canDisplay(o))
|
||
return false;
|
||
if (isDisplayed(o))
|
||
selectObject(o);
|
||
else{
|
||
try{
|
||
objectGroup = new ObjectGroup(o, canvas, this);
|
||
itemsObject.add(objectGroup);
|
||
itemsNameBox.addItem(o.getName());
|
||
showObjectGroup();
|
||
//report if it is an undefined Object
|
||
if (objectGroup.isUndefined()) {
|
||
if (objectGroup.isRelation())
|
||
Reporter.showInfo("Your Relation contains an undefined object");
|
||
else
|
||
Reporter.showInfo("Your Object is undefined. As a result, the object is not visible.");
|
||
}
|
||
//report if it is an empty Object
|
||
if (objectGroup.isEmpty()) {
|
||
if (objectGroup.isRelation())
|
||
Reporter.showInfo("Your Relation contains an empty object");
|
||
else
|
||
Reporter.showInfo("You have an empty Object.");
|
||
}
|
||
// make the new object to active object
|
||
itemsNameBox.setSelectedIndex(itemsNameBox.getItemCount()-1);
|
||
}
|
||
catch(Exception e){
|
||
//e.printStackTrace();
|
||
|
||
Reporter.writeError("Error in addObject= " + e.getStackTrace());
|
||
Reporter.writeError("Error in addObject= " + e.getClass() + " - "
|
||
+ e.getMessage()+" - "+ e.getCause() );
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* isDisplayed
|
||
* @return true if o is contained in this viewer
|
||
*/
|
||
public boolean isDisplayed(SecondoObject o){
|
||
Iterator<ObjectGroup> it = itemsObject.iterator();
|
||
while (it.hasNext()) {
|
||
if (o.equals(it.next().getSecondoObject())) {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
|
||
/**
|
||
* removeAll
|
||
* removes all objects from this viewer
|
||
*/
|
||
public void removeAll(){
|
||
itemsObject.removeAllElements(); // remove all entrys from vector
|
||
itemsNameBox.removeAllItems(); // remove all entrys from combobox
|
||
currentObject =null;
|
||
if (VC !=null)
|
||
VC.removeObject(null);
|
||
clearView();
|
||
}
|
||
|
||
/**
|
||
* removeObject
|
||
* removes SecondoObject o from this viewer
|
||
*/
|
||
public void removeObject (SecondoObject o){
|
||
Iterator<ObjectGroup> it = itemsObject.iterator();
|
||
ObjectGroup objGrp = null;
|
||
boolean itemFound=false;
|
||
while (it.hasNext() && !itemFound) {
|
||
objGrp =it.next();
|
||
if (o.equals(objGrp.getSecondoObject())) {
|
||
itemsObject.remove(objGrp);
|
||
itemsNameBox.removeItem(o.getName());
|
||
itemFound=true;
|
||
}
|
||
}
|
||
if (objGrp.equals(objectGroup)) {
|
||
clearView();
|
||
}
|
||
}
|
||
|
||
|
||
/**
|
||
* canDisplay
|
||
* @return true if this viewer is able to display the given object
|
||
* this viwer can show Spatial3D objects, their relation, and relations of their tuples
|
||
* since algebra structure of Spatial3D migth be still changed, it is tentative.
|
||
*/
|
||
@Override
|
||
public boolean canDisplay(SecondoObject o){
|
||
ListExpr LE = o.toListExpr();
|
||
return typeCheck(LE,false);
|
||
}
|
||
|
||
/**
|
||
* a (recursive) method to test if the given List Expression matches for the viewer.
|
||
* It contains a recursive call, so that it checks nested relation of allowed types.
|
||
* @param ListExpr to be tested
|
||
* @param attr : true-> for attribute check / false -> atom or relation check
|
||
* @return boolean wether it matches to the viewer
|
||
*/
|
||
private boolean typeCheck(ListExpr LE, boolean attr){
|
||
|
||
if(LE.listLength()!=2){
|
||
Reporter.showError("the list has wrong element numbers. It must have 2 elements. but it has " + LE.listLength() + " elements.");
|
||
return false;
|
||
}
|
||
|
||
ListExpr type = attr?LE.second():LE.first(); // LE.secondo() is for attribute check
|
||
|
||
if(!type.isAtom() && !type.isEmpty()){
|
||
return typeCheck(type,false); // goes one level deeper. recursive call;
|
||
}
|
||
|
||
if(!(type.isAtom() && type.atomType() == ListExpr.SYMBOL_ATOM)){
|
||
Reporter.showError("the " + (attr?"second":"first") + " element is not of type of Symbol atom");
|
||
return false;
|
||
}
|
||
|
||
String typeName = type.symbolValue();
|
||
if(typeName.equals("rel") || typeName.equals("mrel") || typeName.equals("trel")) {
|
||
return typeCheck(LE.second(),false); //recursive call
|
||
}
|
||
|
||
if(typeName.equals("tuple")){
|
||
ListExpr values = LE.second();
|
||
//check if one of the attributes has matched type.
|
||
while(!values.isEmpty()){
|
||
if(typeCheck(values.first(),true)) return true; //recursive call for attribute check
|
||
//one of the attribute matches for the type, it returns true
|
||
values=values.rest();
|
||
}
|
||
return false;
|
||
}
|
||
|
||
// check for single atom type
|
||
|
||
for(AllowedObjects ao: AllowedObjects.values()){
|
||
if(typeName.equals(ao.toString())) {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
|
||
/**
|
||
* select a object in this viewer
|
||
* @param SecondoObject o
|
||
*/
|
||
public boolean selectObject(SecondoObject o){
|
||
|
||
Iterator<ObjectGroup> it = itemsObject.iterator();
|
||
ObjectGroup objGrp;
|
||
int index = -1;
|
||
while (it.hasNext()) {
|
||
objGrp =it.next();
|
||
if (o.equals(objGrp.getSecondoObject())) {
|
||
index=itemsObject.indexOf(objGrp);
|
||
if (index<0)
|
||
return false;
|
||
else{
|
||
itemsNameBox.setSelectedIndex(index);
|
||
objectGroup=objGrp;
|
||
showObjectGroup();
|
||
return true;
|
||
}
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
|
||
/**
|
||
* getMenuVector
|
||
* @return menu extension for this viewer
|
||
*/
|
||
public MenuVector getMenuVector(){
|
||
return MenuExtension;
|
||
}
|
||
|
||
/**
|
||
* getDisplayQuality
|
||
* @return [0,1]
|
||
* 0.. viewer can´t display this object
|
||
* 1.. viewr is the best to display the given object
|
||
*/
|
||
public double getDisplayQuality(SecondoObject so){
|
||
if(canDisplay(so))
|
||
return 1; // because this is the only Viewer which can display 3D objects
|
||
else
|
||
return 0;
|
||
}
|
||
|
||
/**
|
||
* showObjectGroup
|
||
* shows the current object group from the selected Secondo Object
|
||
*/
|
||
public void showObjectGroup() {
|
||
|
||
boolean rootSceneExists = false;
|
||
try{
|
||
rootSceneExists=rootScene.equals(objectGroup.showObjectGroup());
|
||
}catch (NullPointerException e) {}
|
||
|
||
if (!rootSceneExists) {
|
||
//set Menu
|
||
if (!settingsMenu.isEnabled())
|
||
settingsMenu.setEnabled(true);
|
||
if (!appearanceMenu.isEnabled())
|
||
appearanceMenu.setEnabled(true);
|
||
if (!viewMenu.isEnabled())
|
||
viewMenu.setEnabled(true);
|
||
menuItem_varyingColorView.setEnabled(objectGroup.isRelation());
|
||
colorChanged=true; // set true in order to objectGroup.showObjectGroup() will be not invoked
|
||
menuItem_varyingColorView.setSelected(objectGroup.getVaryingColorViewSelected());
|
||
menuItem_GridView.setSelected(objectGroup.getDrawGrid());
|
||
|
||
try{
|
||
//set universe
|
||
rootScene.detach();
|
||
rootScene = objectGroup.showObjectGroup();
|
||
ambLightBg.detach();
|
||
ambLightBg = objectGroup.getAmLightBg();
|
||
lights.detach();
|
||
lights=objectGroup.getLights();
|
||
universe.addBranchGraph(rootScene);
|
||
universe.addBranchGraph(ambLightBg);
|
||
universe.addBranchGraph(lights);
|
||
} catch (NullPointerException e) {
|
||
Reporter.writeError("error at adding branch groups");
|
||
Reporter.writeError("Error in clearView= " + e.getStackTrace());
|
||
Reporter.writeError("Error in clearView= " + e.getClass() + " - "
|
||
+ e.getMessage()+" - "+ e.getCause() );
|
||
}
|
||
|
||
// set Text view
|
||
textWindow.clearView();
|
||
if (objectGroup.isRelation())
|
||
textWindow.setView(objectGroup.getTextViewItems());
|
||
|
||
//set LightPanel
|
||
try{
|
||
configPane.removeTabAt(1);
|
||
}catch (Exception E) {}
|
||
configPane.addTab("Lighting", objectGroup.getLightingPanel());
|
||
|
||
//set Scale Factor
|
||
try{
|
||
scaleFactorField.setValue(new Double(objectGroup.getScaleFactor()));
|
||
}catch (NullPointerException e) {
|
||
Reporter.writeError("error at setting scaleFactorField");
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* clearView
|
||
* removes objects from view
|
||
*/
|
||
private void clearView() {
|
||
currentObject=null;
|
||
try{
|
||
//clear universe
|
||
rootScene.detach();
|
||
ambLightBg.detach();
|
||
lights.detach();
|
||
}catch (Exception e) {
|
||
Reporter.writeError("Error in clearView rootScene.detach");
|
||
Reporter.writeError("Error in clearView= " + e.getStackTrace());
|
||
Reporter.writeError("Error in clearView= " + e.getClass() + " - "
|
||
+ e.getMessage()+" - "+ e.getCause() );
|
||
}
|
||
//delete LightTab
|
||
try{
|
||
configPane.removeTabAt(1);
|
||
}catch (Exception E) {}
|
||
|
||
//set new Branch Groups
|
||
rootScene = new BranchGroup();
|
||
rootScene.setCapability(BranchGroup.ALLOW_DETACH);
|
||
ambLightBg = new BranchGroup();
|
||
ambLightBg.setCapability(BranchGroup.ALLOW_DETACH);
|
||
lights = new BranchGroup();
|
||
lights.setCapability(BranchGroup.ALLOW_DETACH);
|
||
|
||
// set rest of view to standard
|
||
textWindow.clearView();
|
||
settingsMenu.setEnabled(false);
|
||
appearanceMenu.setEnabled(false);
|
||
viewMenu.setEnabled(false);
|
||
}
|
||
|
||
/**
|
||
* resettingView
|
||
* creates the current Object new and saves it in itemsObject
|
||
*/
|
||
private void resettingView() {
|
||
//get Index in itemsObject
|
||
Iterator<ObjectGroup> it = itemsObject.iterator();
|
||
ObjectGroup objGrp;
|
||
int index = -1;
|
||
boolean hasFound = false;
|
||
while (it.hasNext() && ! hasFound) {
|
||
objGrp =it.next();
|
||
if (objectGroup.equals(objGrp)) {
|
||
hasFound = true;
|
||
index=itemsObject.indexOf(objGrp);
|
||
}
|
||
}
|
||
if (hasFound) {
|
||
objectGroup = objectGroup = new ObjectGroup(currentObject, canvas, this);
|
||
itemsObject.setElementAt(objectGroup, index);
|
||
showObjectGroup();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* showSelectedObject
|
||
* select the current object which is choose from TextWindow
|
||
* and shows it centered on view
|
||
* @param index comes from TextWindow
|
||
*/
|
||
public void showSelectedObject(int index) {
|
||
objectGroup.showSelectedObject(index);
|
||
try{
|
||
scaleFactorField.setValue(new Double(objectGroup.getScaleFactor()));
|
||
}catch (NullPointerException e) {
|
||
Reporter.writeError("Error at showSelectedObject");
|
||
}
|
||
}
|
||
|
||
/**
|
||
* setSelectedObject
|
||
* set Object on TextView which was choose from 3D View. This
|
||
* Method is invoked from RelationPicking.java.
|
||
*
|
||
* @param index comes from picked shape
|
||
* @param True if no item should select.
|
||
* This is when not item is picked on View
|
||
*/
|
||
public void setSelectedObject(int index, boolean clear) {
|
||
|
||
if ((!clear) && (index != -1)) {
|
||
objectGroup.setCurrentShape(index);
|
||
textWindow.setSelection(index);
|
||
}
|
||
else{
|
||
textWindow.clearSelection();
|
||
objectGroup.setCurrentShape(-1);
|
||
}
|
||
textWindow.repaint();
|
||
}
|
||
|
||
|
||
/**
|
||
* setObjectsColor
|
||
* set the new color for all Objects
|
||
*/
|
||
private void setObjectsColor() {
|
||
objectGroup.changeObjectsColor();
|
||
}
|
||
|
||
/**
|
||
* changeSinglePointSize
|
||
* if it is possible it set Pointsize from current Object
|
||
*/
|
||
public float changeSinglePointSize() {
|
||
if (objectGroup.getCurrentShape().getAppearance().getPointAttributes() !=null) {
|
||
setPointSizeDialog.setVisible(true, true);
|
||
} else{
|
||
Reporter.showInfo("Your Object isn't a Point. "+
|
||
"This option is only available for Points!");
|
||
}
|
||
return objectGroup.getSinglePointSize();
|
||
}
|
||
|
||
/**
|
||
* change size of a single point
|
||
* @param size of point
|
||
*/
|
||
public void changeSinglePointSize(float pntSize) {
|
||
objectGroup.changeSinglePointSize(pntSize);
|
||
}
|
||
|
||
/**
|
||
* changeAllPointSize
|
||
* set the size of Points in Relations
|
||
* @param size of point
|
||
*/
|
||
public void changeAllPointSize(float pntSize) {
|
||
objectGroup.changeAllPointSize(pntSize);
|
||
}
|
||
|
||
/**
|
||
* changeColor
|
||
* public Method to change Color for current Shape
|
||
*/
|
||
public void changeColor(Color col) {
|
||
objectGroup.changeColor(col);
|
||
}
|
||
|
||
/**
|
||
* createMenuExtension
|
||
* create the extension from MenuVector
|
||
*/
|
||
private void createMenuExtension() {
|
||
|
||
//######### settings menu ##############################
|
||
settingsMenu = new JMenu();
|
||
settingsMenu.setText("Settings");
|
||
|
||
// scale factor menu
|
||
menuItem_Scale = new JMenuItem("Scale Factor");
|
||
settingsMenu.add(menuItem_Scale);
|
||
scaleFactorDialog = new ScaleFactorDialog(this);
|
||
menuItem_Scale.addActionListener(new ActionListener(){
|
||
public void actionPerformed(ActionEvent evt){
|
||
scaleFactorDialog.setVisible(true);
|
||
}
|
||
});
|
||
|
||
//show scale option in pane
|
||
menuItem_ScaleView = new JCheckBoxMenuItem ("Show Scale option");
|
||
settingsMenu.add(menuItem_ScaleView);
|
||
menuItem_ScaleView.setSelected(showScaleMenu);
|
||
menuItem_ScaleView.addChangeListener(new ChangeListener() {
|
||
public void stateChanged(ChangeEvent evt) {
|
||
if (showScaleMenu != menuItem_ScaleView.isSelected()) {
|
||
showScaleMenu=menuItem_ScaleView.isSelected();
|
||
toggleScaleLabel(showScaleMenu);
|
||
}
|
||
}
|
||
});
|
||
|
||
// Zoom speed menu
|
||
menuItem_Zoom = new JMenuItem("Zoom Speed");
|
||
settingsMenu.add(menuItem_Zoom);
|
||
zoomfactorDialog = new ZoomFactorDialog(this);
|
||
menuItem_Zoom.addActionListener(new ActionListener(){
|
||
public void actionPerformed(ActionEvent evt){
|
||
zoomfactorDialog.setVisible(true);
|
||
}
|
||
});
|
||
|
||
// Translate speed menu
|
||
menuItem_Translate = new JMenuItem("Transl. Speed");
|
||
settingsMenu.add(menuItem_Translate);
|
||
translateFactorDialog = new TranslateFactorDialog(this);
|
||
menuItem_Translate.addActionListener(new ActionListener(){
|
||
public void actionPerformed(ActionEvent evt){
|
||
translateFactorDialog.setVisible(true);
|
||
}
|
||
});
|
||
|
||
// Rotate speed menu
|
||
menuItem_Rotate = new JMenuItem("Rotate Speed");
|
||
settingsMenu.add(menuItem_Rotate);
|
||
rotateFactorDialog = new RotateFactorDialog(this);
|
||
menuItem_Rotate.addActionListener(new ActionListener(){
|
||
public void actionPerformed(ActionEvent evt){
|
||
rotateFactorDialog.setVisible(true);
|
||
}
|
||
});
|
||
|
||
//######## Appearance menu ###########################
|
||
appearanceMenu = new JMenu();
|
||
appearanceMenu.setText("Appearance");
|
||
|
||
//Grid View menu
|
||
menuItem_GridView = new JCheckBoxMenuItem ("Grid view");
|
||
appearanceMenu.add(menuItem_GridView);
|
||
menuItem_GridView.setSelected(objectGroup.getDrawGrid());
|
||
menuItem_GridView.addChangeListener(new ChangeListener() {
|
||
public void stateChanged(ChangeEvent evt) {
|
||
if (objectGroup.getDrawGrid() != menuItem_GridView.isSelected()) {
|
||
objectGroup.setDrawGrid(menuItem_GridView.isSelected());
|
||
}
|
||
}
|
||
});
|
||
|
||
//varying Color View menu
|
||
menuItem_varyingColorView = new JCheckBoxMenuItem ("varying colors (Rel)");
|
||
appearanceMenu.add(menuItem_varyingColorView);
|
||
menuItem_varyingColorView.setEnabled(objectGroup.isRelation());
|
||
menuItem_varyingColorView.setSelected(objectGroup.getVaryingColorViewSelected());
|
||
menuItem_varyingColorView.addChangeListener(new ChangeListener() {
|
||
public void stateChanged(ChangeEvent evt) {
|
||
if (objectGroup.getVaryingColorViewSelected() != menuItem_varyingColorView.isSelected()) {
|
||
if (colorChanged) {
|
||
colorChanged=false;
|
||
}else{
|
||
objectGroup.setVaryingColorViewSelected(menuItem_varyingColorView.isSelected());
|
||
objectGroup.changeObjectsColor();
|
||
}
|
||
}
|
||
}
|
||
});
|
||
|
||
//set point size menu
|
||
menuItem_setPointSize = new JMenuItem("Point Size");
|
||
appearanceMenu.add(menuItem_setPointSize);
|
||
setPointSizeDialog = new SetPointSizeDialog(this);
|
||
menuItem_setPointSize.addActionListener(new ActionListener(){
|
||
public void actionPerformed(ActionEvent evt){
|
||
setPointSizeDialog.setVisible(true, false);
|
||
}
|
||
});
|
||
|
||
//set Colors menu...
|
||
setColorsMenu = new JMenu("Set Colors");
|
||
appearanceMenu.add(setColorsMenu);
|
||
|
||
//set Background Color
|
||
menuItem_setBackgroundColor = new JMenuItem("Background");
|
||
setColorsMenu.add(menuItem_setBackgroundColor);
|
||
menuItem_setBackgroundColor.addActionListener(new ActionListener(){
|
||
public void actionPerformed(ActionEvent evt){
|
||
objectGroup.changeBackgroundColor();
|
||
}
|
||
});
|
||
|
||
//set Object Color
|
||
menuItem_setObjectColor = new JMenuItem("Object");
|
||
setColorsMenu.add(menuItem_setObjectColor);
|
||
menuItem_setObjectColor.addActionListener(new ActionListener(){
|
||
public void actionPerformed(ActionEvent evt){
|
||
Color selColor = JColorChooser.showDialog(null,
|
||
"Choose the object color!", objectGroup.getObjectColor().get());
|
||
if (selColor !=null) {
|
||
if (!selColor.equals(objectGroup.getObjectColor().get())) {
|
||
objectGroup.setObjectColor(selColor);
|
||
if (!objectGroup.getDrawGrid()) {
|
||
colorChanged=true;
|
||
menuItem_varyingColorView.setSelected(objectGroup.getVaryingColorViewSelected());
|
||
}
|
||
}
|
||
}
|
||
}
|
||
});
|
||
|
||
//set Grid Color
|
||
menuItem_setGridColor = new JMenuItem("Grid");
|
||
setColorsMenu.add(menuItem_setGridColor);
|
||
menuItem_setGridColor.addActionListener(new ActionListener(){
|
||
public void actionPerformed(ActionEvent evt){
|
||
Color selColor = JColorChooser.showDialog(null,
|
||
"Choose the grid color!", objectGroup.getGridColor().get());
|
||
if (selColor !=null) {
|
||
if (!selColor.equals(objectGroup.getGridColor().get())) {
|
||
objectGroup.setGridColor(selColor);
|
||
if (objectGroup.getDrawGrid()) {
|
||
colorChanged=true;
|
||
menuItem_varyingColorView.setSelected(objectGroup.getVaryingColorViewSelected());
|
||
}
|
||
}
|
||
}
|
||
}
|
||
});
|
||
|
||
//set default...
|
||
setDefaultColorsMenu = new JMenu("Set Default Colors");
|
||
appearanceMenu.add(setDefaultColorsMenu);
|
||
|
||
//set Background Color default
|
||
menuItem_setDefaultBackgroundColor= new JMenuItem("Background");
|
||
setDefaultColorsMenu.add(menuItem_setDefaultBackgroundColor);
|
||
menuItem_setDefaultBackgroundColor.addActionListener(new ActionListener(){
|
||
public void actionPerformed(ActionEvent evt){
|
||
objectGroup.setDefaultBackgroundColor();
|
||
}
|
||
});
|
||
|
||
//set Object Color default
|
||
menuItem_setDefaultObjectColor = new JMenuItem("Object");
|
||
setDefaultColorsMenu.add(menuItem_setDefaultObjectColor);
|
||
menuItem_setDefaultObjectColor.addActionListener(new ActionListener(){
|
||
public void actionPerformed(ActionEvent evt){
|
||
objectGroup.setDefaultObjectColor();
|
||
if (!objectGroup.getDrawGrid()) {
|
||
colorChanged=true;
|
||
menuItem_varyingColorView.setSelected(objectGroup.getVaryingColorViewSelected());
|
||
}
|
||
}
|
||
});
|
||
|
||
//set Grid Color default
|
||
menuItem_setDefaultGridColor = new JMenuItem("Grid");
|
||
setDefaultColorsMenu.add(menuItem_setDefaultGridColor);
|
||
menuItem_setDefaultGridColor.addActionListener(new ActionListener(){
|
||
public void actionPerformed(ActionEvent evt){
|
||
objectGroup.setDefaultGridColor();
|
||
if (objectGroup.getDrawGrid()) {
|
||
colorChanged=true;
|
||
menuItem_varyingColorView.setSelected(objectGroup.getVaryingColorViewSelected());
|
||
}
|
||
}
|
||
});
|
||
|
||
//set View Menu
|
||
viewMenu= new JMenu("View");
|
||
|
||
//set center view
|
||
menuItem_centerView = new JMenuItem("centering");
|
||
viewMenu.add(menuItem_centerView);
|
||
menuItem_centerView.addActionListener(new ActionListener(){
|
||
public void actionPerformed(ActionEvent evt){
|
||
objectGroup.centeringView();
|
||
try{
|
||
scaleFactorField.setValue(new Double(objectGroup.getScaleFactor()));
|
||
}catch (NullPointerException e) {
|
||
Reporter.writeError("Error at showSelectedObject");
|
||
}
|
||
}
|
||
});
|
||
|
||
//ser reset view
|
||
menuItem_resetView = new JMenuItem("resetting");
|
||
viewMenu.add(menuItem_resetView);
|
||
menuItem_resetView.addActionListener(new ActionListener(){
|
||
public void actionPerformed(ActionEvent evt){
|
||
resettingView();
|
||
}
|
||
});
|
||
|
||
|
||
// ########add menus to MenuExtension ###############
|
||
MenuExtension.addMenu(settingsMenu);
|
||
MenuExtension.addMenu(appearanceMenu);
|
||
MenuExtension.addMenu(viewMenu);
|
||
|
||
}// end createMenuExtension
|
||
|
||
/**
|
||
* toggleScaleLabel
|
||
* add and remove Scale Label to the panel; If this Label is visible
|
||
* it is much easier to change scale factor
|
||
*/
|
||
private void toggleScaleLabel(boolean addLabel) {
|
||
if (addLabel) {
|
||
scaleFactorField.setValue(new Double(objectGroup.getScaleFactor()));
|
||
scaleFactorField.setColumns(4);
|
||
scaleFactorField.addPropertyChangeListener("value",
|
||
new PropertyChangeListener()
|
||
{
|
||
@Override
|
||
public void propertyChange(PropertyChangeEvent evt)
|
||
{
|
||
if (!objectGroup.getAutoScaleFactor()) {
|
||
double factor=((Number)scaleFactorField.getValue()).doubleValue();
|
||
if (factor>100.0) {
|
||
factor=100;
|
||
}
|
||
if (factor<0.0001) {
|
||
factor=0.0001;
|
||
}
|
||
objectGroup.setScaleFactor(factor, false); // and show object
|
||
}
|
||
}
|
||
});
|
||
|
||
scaleFactorField.addMouseListener(new MouseAdapter()
|
||
{
|
||
public void mouseReleased(MouseEvent e) {
|
||
objectGroup.setAutoScaleFactor(false);
|
||
}
|
||
});
|
||
|
||
boxPanel.add(scaleFactorLabel);
|
||
boxPanel.add(scaleFactorField);
|
||
boxPanel.revalidate();
|
||
boxPanel.repaint();
|
||
}
|
||
else
|
||
{
|
||
try{
|
||
boxPanel.remove(scaleFactorLabel);
|
||
boxPanel.remove(scaleFactorField);
|
||
boxPanel.revalidate();
|
||
boxPanel.repaint();
|
||
}
|
||
catch (Exception e) {}
|
||
}
|
||
} // end toggleScaleLabel
|
||
|
||
|
||
/** getter and setter --------------------------------- */
|
||
/** scaleFactor */
|
||
public double getScaleFactor() {
|
||
if(objectGroup==null) return 1.0;
|
||
return objectGroup.getScaleFactor();
|
||
}
|
||
|
||
/**
|
||
* to set factor for scaling
|
||
* @param scale factor
|
||
* @param weather auto or not
|
||
*/
|
||
public void setScaleFactor(double factor, boolean setAuto) {
|
||
if(objectGroup == null) return;
|
||
objectGroup.setScaleFactor(factor, setAuto);
|
||
try{
|
||
scaleFactorField.setValue(new Double(objectGroup.getScaleFactor()));
|
||
}catch (NullPointerException e) {
|
||
Reporter.writeError("Error at setScaleFactor");
|
||
}
|
||
}
|
||
|
||
/**
|
||
* getter zoomFactor
|
||
* @return zoomfactor
|
||
* */
|
||
public double getZoomFactor() {
|
||
if(objectGroup==null)return 1.0;
|
||
return objectGroup.getZoomFactor();
|
||
}
|
||
|
||
/**
|
||
* to set factor of zooming
|
||
* @param zooming factor
|
||
*/
|
||
public void setZoomFactor(double factor) {
|
||
if(objectGroup==null) return;
|
||
objectGroup.setZoomFactor(factor);
|
||
}
|
||
|
||
/**
|
||
* getter translateFactor
|
||
* @return factor of translate
|
||
* */
|
||
public double getTranslateFactor() {
|
||
if(objectGroup==null)return 1.0;
|
||
return objectGroup.getTranslateFactor();
|
||
}
|
||
|
||
/**
|
||
* to set factor of translate
|
||
* @param translate factor to be set
|
||
*/
|
||
public void setTranslateFactor(double factor) {
|
||
if(objectGroup==null) return;
|
||
objectGroup.setTranslateFactor(factor);
|
||
}
|
||
|
||
/**
|
||
* getter rotateFactor
|
||
* @return rotate factor
|
||
*/
|
||
public double getRotateFactor() {
|
||
if(objectGroup==null)return 1.0;
|
||
return objectGroup.getRotateFactor();
|
||
}
|
||
|
||
/**
|
||
* to set factor of rotation.
|
||
* @param rotate factor to be set.
|
||
*/
|
||
public void setRotateFactor(double factor) {
|
||
if(objectGroup==null) return;
|
||
objectGroup.setRotateFactor(factor);
|
||
}
|
||
|
||
/**
|
||
* getter pointSize
|
||
* @return size of point
|
||
*/
|
||
public double getPointSize() {
|
||
if(objectGroup==null) return 1.0;
|
||
return objectGroup.getPointSize();
|
||
}
|
||
|
||
/**
|
||
* to set size of single point
|
||
* @param size to be set
|
||
*/
|
||
public void setSinglePointSize(float sPntSize) {
|
||
if(objectGroup==null) return;
|
||
objectGroup.setSinglePointSize(sPntSize);
|
||
}
|
||
|
||
/**
|
||
* getter ObjectColor
|
||
* @return color of object
|
||
*/
|
||
public Color3f getObjectColor() {
|
||
if(objectGroup==null) return null;
|
||
return objectGroup.getObjectColor();
|
||
}
|
||
|
||
/**
|
||
* getter CurrentShape
|
||
* taken from Object group
|
||
* @return CurrentShape
|
||
*/
|
||
public Shape3D getCurrentShape() {
|
||
if(objectGroup==null)return null;
|
||
return objectGroup.getCurrentShape();
|
||
}
|
||
|
||
/**
|
||
* getter TextWindow
|
||
* @return Text Window
|
||
*/
|
||
public TextWindow getTextWindow() {
|
||
return textWindow;
|
||
}
|
||
|
||
|
||
/** returns the MainFrame of application
|
||
* needed for showing dialogs
|
||
*/
|
||
public Frame getMainFrame(){
|
||
if (VC!=null)
|
||
return VC.getMainFrame();
|
||
else
|
||
return null;
|
||
}
|
||
|
||
/**
|
||
* add an individual light
|
||
*/
|
||
public void addLight(){
|
||
LightBranchGroup lightBg = new LightBranchGroup(objectGroup.getLightingPanel());
|
||
objectGroup.addLight(lightBg);
|
||
}
|
||
|
||
/**
|
||
* return the light at index
|
||
* @param index: index for selected light
|
||
* @return returns the LightBranchGroup at the given index
|
||
*/
|
||
public LightBranchGroup getLight(int index){
|
||
return objectGroup.getLight(index);
|
||
}
|
||
|
||
/**
|
||
* delete a light at index
|
||
* @param index: index for selected light
|
||
*/
|
||
public void delLight(int index){
|
||
objectGroup.delLight(index);
|
||
}
|
||
|
||
/**
|
||
* set lighting area of light at lindex with radius of "distance"
|
||
* @param distance: radius of reaching sphere of the light
|
||
* @param index: index for selected light
|
||
*/
|
||
public void delAllLight(int indeces){
|
||
for(int i=0; i<indeces; i++){
|
||
delLight(0);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* getter LightColor
|
||
* @return color of light
|
||
*/
|
||
public Color3f getLightColor(){
|
||
return objectGroup.getLightColor();
|
||
}
|
||
|
||
/**
|
||
* setter LightColor
|
||
* @param color to be set
|
||
*/
|
||
public void setLightColor(Color color){
|
||
objectGroup.setLightColor(color);
|
||
}
|
||
|
||
/**
|
||
* setter ambLight
|
||
* @param on/off
|
||
*/
|
||
public void setMainLightSwitch(boolean sw){
|
||
objectGroup.setMainLightSwitch(sw);
|
||
}
|
||
|
||
/**
|
||
* getter on/off ambLight
|
||
* @return if light is on
|
||
*/
|
||
public boolean getMainLightSwitch(){
|
||
return objectGroup.getMainLightSwitch();
|
||
}
|
||
|
||
/**
|
||
* to activate mouse movement only selected light at the index
|
||
* @param lindex of light
|
||
*/
|
||
public void setLightMouseMove(int index){
|
||
objectGroup.setLightMouseMove(index);
|
||
}
|
||
|
||
/**
|
||
* getter for light panel
|
||
* @return light panel
|
||
*/
|
||
public LightPanel getLightPanel(){
|
||
return objectGroup.getLightingPanel();
|
||
}
|
||
|
||
/**
|
||
* to add Lighting Panel
|
||
* @param obsolete dummy
|
||
*/
|
||
public void addLightingPanel(LightPanel tab) {
|
||
try{
|
||
configPane.removeTabAt(1);
|
||
}catch (Exception E) {}
|
||
configPane.addTab("Lighting", objectGroup.getLightingPanel());
|
||
}
|
||
|
||
}
|