/** * Sets the mass. Overrides PointMass method. * * @param mass the mass */ public void setMass(double mass) { super.setMass(mass); mass = super.getMass(); massField.setValue(mass); // refresh mass parameter in paramPanel if changed Parameter massParam = (Parameter) getParamEditor().getObject("m"); // $NON-NLS-1$ if (massParam != null && massParam.getValue() != mass) { functionPanel.getParamEditor().setExpression("m", String.valueOf(mass), false); // $NON-NLS-1$ refreshSteps(); } }
/** Refreshes initial time parameter for this model. */ protected void refreshInitialTime() { if (trackerPanel == null) return; double t0 = trackerPanel.getPlayer().getFrameTime(getStartFrame()) / 1000; String t = timeFormat.format(t0); Parameter param = (Parameter) getInitEditor().getObject("t"); // $NON-NLS-1$ if (param.getValue() != t0) { boolean prev = refreshing; refreshing = true; getInitEditor().setExpression("t", t, false); // $NON-NLS-1$ refreshing = prev; } }
/** * Creates a new DataFunctionPanel for a track, autoloading appropriate data functions. * * @param track the track */ protected FunctionPanel createFunctionPanel(TTrack track) { FunctionPanel panel = new DataFunctionPanel(track.getData(trackerPanel)); panel.setIcon(track.getIcon(21, 16, "point")); // $NON-NLS-1$ Class<?> type = track.getClass(); if (PointMass.class.isAssignableFrom(type)) panel.setDescription(PointMass.class.getName()); else if (Vector.class.isAssignableFrom(type)) panel.setDescription(Vector.class.getName()); else if (RGBRegion.class.isAssignableFrom(type)) panel.setDescription(RGBRegion.class.getName()); else if (LineProfile.class.isAssignableFrom(type)) panel.setDescription(LineProfile.class.getName()); else panel.setDescription(type.getName()); final ParamEditor paramEditor = panel.getParamEditor(); if (track instanceof PointMass) { final PointMass m = (PointMass) track; Parameter param = (Parameter) paramEditor.getObject("m"); // $NON-NLS-1$ if (param == null) { param = new Parameter("m", String.valueOf(m.getMass())); // $NON-NLS-1$ param.setDescription( TrackerRes.getString("ParticleModel.Parameter.Mass.Description")); // $NON-NLS-1$ paramEditor.addObject(param, false); } param.setNameEditable(false); // mass name not editable paramEditor.addPropertyChangeListener( new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent e) { if ("m".equals(e.getOldValue())) { // $NON-NLS-1$ Parameter param = (Parameter) paramEditor.getObject("m"); // $NON-NLS-1$ if (m.getMass() != param.getValue()) { m.setMass(param.getValue()); m.massField.setValue(m.getMass()); } } } }); m.addPropertyChangeListener( "mass", new PropertyChangeListener() { //$NON-NLS-1$ public void propertyChange(PropertyChangeEvent e) { Parameter param = (Parameter) paramEditor.getObject("m"); // $NON-NLS-1$ double newMass = (Double) e.getNewValue(); if (newMass != param.getValue()) { paramEditor.setExpression("m", String.valueOf(newMass), false); // $NON-NLS-1$ } } }); } return panel; }
/** This adds the mass and initial time parameters to the function panel. */ protected void createMassAndTimeParameters() { Parameter param = new Parameter("m", String.valueOf(getMass())); // $NON-NLS-1$ param.setNameEditable(false); param.setDescription( TrackerRes.getString("ParticleModel.Parameter.Mass.Description")); // $NON-NLS-1$ getParamEditor().addObject(param, false); param = new Parameter("t", "0"); // $NON-NLS-1$ //$NON-NLS-2$ param.setNameEditable(false); param.setDescription( TrackerRes.getString("ParticleModel.Parameter.InitialTime.Description")); // $NON-NLS-1$ functionPanel.getInitEditor().addObject(param, false); getParamEditor() .addPropertyChangeListener( new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent e) { if ("m".equals(e.getOldValue())) { // $NON-NLS-1$ Parameter param = (Parameter) getParamEditor().getObject("m"); // $NON-NLS-1$ if (ParticleModel.super.getMass() != param.getValue()) { setMass(param.getValue()); } } } }); getInitEditor() .addPropertyChangeListener( new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent e) { if (refreshing) return; if ("t".equals(e.getOldValue()) && trackerPanel != null) { // $NON-NLS-1$ Parameter param = (Parameter) getInitEditor().getObject("t"); // $NON-NLS-1$ VideoClip clip = trackerPanel.getPlayer().getVideoClip(); double timeOffset = param.getValue() * 1000 - clip.getStartTime(); double dt = trackerPanel.getPlayer().getMeanStepDuration(); int n = clip.getStartFrameNumber(); boolean mustRound = timeOffset % dt > 0; n += clip.getStepSize() * (int) Math.round(timeOffset / dt); setStartFrame(n); if (getStartFrame() != n || mustRound) Toolkit.getDefaultToolkit().beep(); } } }); }
/** * Loads an object with data from an XMLControl. * * @param control the control * @param obj the object * @return the loaded object */ public Object loadObject(XMLControl control, Object obj) { // load track data XML.getLoader(TTrack.class).loadObject(control, obj); ParticleModel p = (ParticleModel) obj; p.mass = control.getDouble("mass"); // $NON-NLS-1$ p.inspectorX = control.getInt("inspector_x"); // $NON-NLS-1$ p.inspectorY = control.getInt("inspector_y"); // $NON-NLS-1$ p.inspectorH = control.getInt("inspector_h"); // $NON-NLS-1$ p.showInspector = control.getBoolean("inspector_visible"); // $NON-NLS-1$ Parameter[] params = (Parameter[]) control.getObject("user_parameters"); // $NON-NLS-1$ p.getParamEditor().setParameters(params); params = (Parameter[]) control.getObject("initial_values"); // $NON-NLS-1$ // remove trailing "0" from initial condition parameters for (int i = 0; i < params.length; i++) { Parameter param = params[i]; String name = param.getName(); int n = name.lastIndexOf("0"); // $NON-NLS-1$ if (n > -1) { // replace parameter with new one name = name.substring(0, n); Parameter newParam = new Parameter(name, param.getExpression()); newParam.setDescription(param.getDescription()); newParam.setNameEditable(false); params[i] = newParam; } } p.getInitEditor().setParameters(params); UserFunction[] functions = (UserFunction[]) control.getObject("main_functions"); // $NON-NLS-1$ p.getFunctionEditor().setMainFunctions(functions); functions = (UserFunction[]) control.getObject("support_functions"); // $NON-NLS-1$ if (functions != null) { for (int i = 0; i < functions.length; i++) { p.getFunctionEditor().addObject(functions[i], false); } } p.functionPanel.refreshFunctions(); int n = control.getInt("start_frame"); // $NON-NLS-1$ if (n != Integer.MIN_VALUE) p.startFrame = n; else { p.startFrameUndefined = true; } n = control.getInt("end_frame"); // $NON-NLS-1$ if (n != Integer.MIN_VALUE) p.endFrame = n; return obj; }
/** * Chooses data functions from a DataBuilder XMLControl. * * @param control the XMLControl * @param description "Save" or "Load" * @param selectedFunctions collection of DataFunction choices * @return true if user clicked OK */ @SuppressWarnings("unchecked") protected boolean chooseBuilderDataFunctions( XMLControl control, String description, Collection<String[]> selectedFunctions) { ListChooser listChooser = new ListChooser( TrackerRes.getString( "TrackerPanel.DataBuilder." + description + ".Title"), // $NON-NLS-1$ //$NON-NLS-2$ TrackerRes.getString( "TrackerPanel.DataBuilder." + description + ".Message"), //$NON-NLS-1$ //$NON-NLS-2$ this); listChooser.setSeparator(" = "); // $NON-NLS-1$ // choose the elements and save ArrayList<String[]> originals = new ArrayList<String[]>(); ArrayList<String[]> choices = new ArrayList<String[]>(); ArrayList<String> names = new ArrayList<String>(); ArrayList<String> expressions = new ArrayList<String>(); ArrayList<String> trackTypes = new ArrayList<String>(); Map<String, XMLControl> xmlControlMap = new TreeMap<String, XMLControl>(); Map<String, ArrayList<Parameter>> parameterMap = new TreeMap<String, ArrayList<Parameter>>(); Map<String, ArrayList<String[]>> functionMap = new TreeMap<String, ArrayList<String[]>>(); for (Object obj : control.getPropertyContent()) { if (obj instanceof XMLProperty) { XMLProperty prop = (XMLProperty) obj; for (XMLControl xmlControl : prop.getChildControls()) { if (xmlControl.getObjectClass() != DataFunctionPanel.class) continue; // get track type (description) and map to panel xmlControl String trackType = xmlControl.getString("description"); // $NON-NLS-1$ xmlControlMap.put(trackType, xmlControl); // get the list of functions for this track type ArrayList<String[]> functions = functionMap.get(trackType); if (functions == null) { functions = new ArrayList<String[]>(); functionMap.put(trackType, functions); } // add functions found in this xmlControl unless already present ArrayList<String[]> panelFunctions = (ArrayList<String[]>) xmlControl.getObject("functions"); // $NON-NLS-1$ outer: for (String[] f : panelFunctions) { // check for duplicate function names for (String[] existing : functions) { if (existing[0].equals(f[0])) continue outer; } functions.add(f); } // get the list of parameters for this track type ArrayList<Parameter> params = parameterMap.get(trackType); if (params == null) { params = new ArrayList<Parameter>(); parameterMap.put(trackType, params); } // add parameters found in this xmlControl unless already present Parameter[] panelParams = (Parameter[]) xmlControl.getObject("user_parameters"); // $NON-NLS-1$ outer: for (Parameter p : panelParams) { if (trackType.endsWith("PointMass") && p.getName().equals("m")) { // $NON-NLS-1$ //$NON-NLS-2$ continue outer; } // check for duplicate parameter names for (Parameter existing : params) { if (existing.getName().equals(p.getName())) continue outer; } params.add(p); } } } } for (String trackType : functionMap.keySet()) { ArrayList<String[]> functions = functionMap.get(trackType); for (String[] f : functions) { originals.add(f); choices.add(f); names.add(f[0]); expressions.add(f[1]); String shortName = XML.getExtension(trackType); String localized = TrackerRes.getString(shortName + ".Name"); // $NON-NLS-1$ if (!localized.startsWith("!")) shortName = localized; // $NON-NLS-1$ trackTypes.add("[" + shortName + "]"); // $NON-NLS-1$ //$NON-NLS-2$ } } // select all by default boolean[] selected = new boolean[choices.size()]; for (int i = 0; i < selected.length; i++) { selected[i] = true; } if (listChooser.choose(choices, names, expressions, trackTypes, selected)) { // compare choices with originals and remove unwanted object content for (String[] function : originals) { if (!choices.contains(function)) { for (String trackType : xmlControlMap.keySet()) { ArrayList<String[]> functions = functionMap.get(trackType); functions.remove(function); } } } // set functions in xmlControl for each trackType for (String trackType : xmlControlMap.keySet()) { ArrayList<String[]> functions = functionMap.get(trackType); ArrayList<Parameter> paramList = parameterMap.get(trackType); Parameter[] params = paramList.toArray(new Parameter[paramList.size()]); XMLControl xmlControl = xmlControlMap.get(trackType); xmlControl.setValue("functions", functions); // $NON-NLS-1$ xmlControl.setValue("user_parameters", params); // $NON-NLS-1$ } // keep only xmlControls that have functions and are in xmlControlMap for (Object next : control.getPropertyContent()) { if (next instanceof XMLProperty && ((XMLProperty) next).getPropertyName().equals("functions")) { // $NON-NLS-1$ XMLProperty panels = (XMLProperty) next; java.util.List<Object> content = panels.getPropertyContent(); ArrayList<Object> toRemove = new ArrayList<Object>(); for (Object child : content) { XMLControl xmlControl = ((XMLProperty) child).getChildControls()[0]; if (!xmlControlMap.values().contains(xmlControl)) { toRemove.add(child); } else { // check to see if functions is empty ArrayList<String[]> functions = (ArrayList<String[]>) xmlControl.getObject("functions"); // $NON-NLS-1$ if (functions == null || functions.isEmpty()) { toRemove.add(child); } } } for (Object remove : toRemove) { content.remove(remove); } } } return true; } return false; }
/** * Gets the mass. Overrides PointMass method. * * @return the mass */ public double getMass() { Parameter massParam = (Parameter) getParamEditor().getObject("m"); // $NON-NLS-1$ if (massParam != null) return massParam.getValue(); return super.getMass(); }