//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 itemsObject = new Vector(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 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 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 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 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