Fix appearance multi-comp select

This commit is contained in:
SiboVG 2022-06-15 17:50:46 +02:00
parent d398d48d55
commit 4b614ff11a
5 changed files with 263 additions and 61 deletions

View File

@ -1,10 +1,14 @@
package net.sf.openrocket.appearance; package net.sf.openrocket.appearance;
import net.sf.openrocket.appearance.Decal.EdgeMode; import net.sf.openrocket.appearance.Decal.EdgeMode;
import net.sf.openrocket.rocketcomponent.RocketComponent;
import net.sf.openrocket.util.AbstractChangeSource; import net.sf.openrocket.util.AbstractChangeSource;
import net.sf.openrocket.util.Color; import net.sf.openrocket.util.Color;
import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.Coordinate;
import java.util.LinkedHashMap;
import java.util.Map;
/** /**
* Use this class to build an immutable Appearance object in a friendly way. Set * Use this class to build an immutable Appearance object in a friendly way. Set
* the various values one at a time with the setter methods and then call * the various values one at a time with the setter methods and then call
@ -28,6 +32,13 @@ public class AppearanceBuilder extends AbstractChangeSource {
private Decal.EdgeMode edgeMode; private Decal.EdgeMode edgeMode;
private boolean batch; private boolean batch;
/**
* List of appearance builders that will set their appearance properties to the same as the current appearance
*/
private final Map<RocketComponent, AppearanceBuilder> configListeners = new LinkedHashMap<>();
// If true, appearance change events will not be fired
private boolean bypassAppearanceChangeEvent = false;
/** /**
* Default constructor * Default constructor
@ -59,7 +70,9 @@ public class AppearanceBuilder extends AbstractChangeSource {
rotation = 0; rotation = 0;
image = null; image = null;
edgeMode = EdgeMode.REPEAT; edgeMode = EdgeMode.REPEAT;
fireChangeEvent();//shouldn't this fire change event? if (!bypassAppearanceChangeEvent) {
fireChangeEvent();
}
} }
/** /**
@ -88,6 +101,9 @@ public class AppearanceBuilder extends AbstractChangeSource {
* @param d The decal * @param d The decal
*/ */
public void setDecal(Decal d){ public void setDecal(Decal d){
for (AppearanceBuilder listener : configListeners.values()) {
listener.setDecal(d);
}
if (d != null) { if (d != null) {
setOffset(d.getOffset().x, d.getOffset().y); setOffset(d.getOffset().x, d.getOffset().y);
setCenter(d.getCenter().x, d.getCenter().y); setCenter(d.getCenter().x, d.getCenter().y);
@ -96,7 +112,9 @@ public class AppearanceBuilder extends AbstractChangeSource {
setEdgeMode(d.getEdgeMode()); setEdgeMode(d.getEdgeMode());
setImage(d.getImage()); setImage(d.getImage());
} }
fireChangeEvent(); if (!bypassAppearanceChangeEvent) {
fireChangeEvent();
}
} }
/** /**
@ -137,9 +155,13 @@ public class AppearanceBuilder extends AbstractChangeSource {
* @param paint the new color * @param paint the new color
*/ */
public void setPaint(Color paint) { public void setPaint(Color paint) {
for (AppearanceBuilder listener : configListeners.values()) {
listener.setPaint(paint);
}
this.paint = paint; this.paint = paint;
fireChangeEvent(); if (!bypassAppearanceChangeEvent) {
fireChangeEvent();
}
} }
/** /**
@ -158,8 +180,13 @@ public class AppearanceBuilder extends AbstractChangeSource {
* @param shine the new shine for template * @param shine the new shine for template
*/ */
public void setShine(double shine) { public void setShine(double shine) {
for (AppearanceBuilder listener : configListeners.values()) {
listener.setShine(shine);
}
this.shine = shine; this.shine = shine;
fireChangeEvent(); if (!bypassAppearanceChangeEvent) {
fireChangeEvent();
}
} }
/** /**
@ -179,6 +206,9 @@ public class AppearanceBuilder extends AbstractChangeSource {
* @param opacity new opacity value expressed in a percentage, where 0 is fully transparent and 1 is fully opaque * @param opacity new opacity value expressed in a percentage, where 0 is fully transparent and 1 is fully opaque
*/ */
public void setOpacity(double opacity) { public void setOpacity(double opacity) {
for (AppearanceBuilder listener : configListeners.values()) {
listener.setOpacity(opacity);
}
if (this.paint == null) { if (this.paint == null) {
return; return;
} }
@ -187,7 +217,9 @@ public class AppearanceBuilder extends AbstractChangeSource {
opacity = Math.max(0, Math.min(1, opacity)); opacity = Math.max(0, Math.min(1, opacity));
this.paint.setAlpha((int) (opacity * 255)); this.paint.setAlpha((int) (opacity * 255));
fireChangeEvent(); if (!bypassAppearanceChangeEvent) {
fireChangeEvent();
}
} }
/** /**
@ -207,8 +239,13 @@ public class AppearanceBuilder extends AbstractChangeSource {
* @param offsetU the new offset to be used * @param offsetU the new offset to be used
*/ */
public void setOffsetU(double offsetU) { public void setOffsetU(double offsetU) {
for (AppearanceBuilder listener : configListeners.values()) {
listener.setOffsetU(offsetU);
}
this.offsetU = offsetU; this.offsetU = offsetU;
fireChangeEvent(); if (!bypassAppearanceChangeEvent) {
fireChangeEvent();
}
} }
/** /**
@ -227,8 +264,13 @@ public class AppearanceBuilder extends AbstractChangeSource {
* @param offsetV the new offset to be used * @param offsetV the new offset to be used
*/ */
public void setOffsetV(double offsetV) { public void setOffsetV(double offsetV) {
for (AppearanceBuilder listener : configListeners.values()) {
listener.setOffsetV(offsetV);
}
this.offsetV = offsetV; this.offsetV = offsetV;
fireChangeEvent(); if (!bypassAppearanceChangeEvent) {
fireChangeEvent();
}
} }
/** /**
@ -259,8 +301,13 @@ public class AppearanceBuilder extends AbstractChangeSource {
* @param centerU value of axis U for center * @param centerU value of axis U for center
*/ */
public void setCenterU(double centerU) { public void setCenterU(double centerU) {
for (AppearanceBuilder listener : configListeners.values()) {
listener.setCenterU(centerU);
}
this.centerU = centerU; this.centerU = centerU;
fireChangeEvent(); if (!bypassAppearanceChangeEvent) {
fireChangeEvent();
}
} }
/** /**
@ -276,11 +323,16 @@ public class AppearanceBuilder extends AbstractChangeSource {
* set a new value for axis V for center in template * set a new value for axis V for center in template
* fires change event * fires change event
* *
* @param centerU value of axis V for center * @return value of axis V for center
*/ */
public void setCenterV(double centerV) { public void setCenterV(double centerV) {
for (AppearanceBuilder listener : configListeners.values()) {
listener.setCenterV(centerV);
}
this.centerV = centerV; this.centerV = centerV;
fireChangeEvent(); if (!bypassAppearanceChangeEvent) {
fireChangeEvent();
}
} }
/** /**
@ -311,8 +363,13 @@ public class AppearanceBuilder extends AbstractChangeSource {
* @param scaleU new value of scalling in axis U * @param scaleU new value of scalling in axis U
*/ */
public void setScaleU(double scaleU) { public void setScaleU(double scaleU) {
for (AppearanceBuilder listener : configListeners.values()) {
listener.setScaleU(scaleU);
}
this.scaleU = scaleU; this.scaleU = scaleU;
fireChangeEvent(); if (!bypassAppearanceChangeEvent) {
fireChangeEvent();
}
} }
/** /**
@ -331,8 +388,13 @@ public class AppearanceBuilder extends AbstractChangeSource {
* @param scaleV new value of scalling in axis V * @param scaleV new value of scalling in axis V
*/ */
public void setScaleV(double scaleV) { public void setScaleV(double scaleV) {
for (AppearanceBuilder listener : configListeners.values()) {
listener.setScaleV(scaleV);
}
this.scaleV = scaleV; this.scaleV = scaleV;
fireChangeEvent(); if (!bypassAppearanceChangeEvent) {
fireChangeEvent();
}
} }
/** /**
@ -379,7 +441,7 @@ public class AppearanceBuilder extends AbstractChangeSource {
* sets a new value of axis Y for scalling in template * sets a new value of axis Y for scalling in template
* fires change event * fires change event
* *
* @param scaleX the new value for axis Y * @param scaleY the new value for axis Y
*/ */
public void setScaleY(double scaleY) { public void setScaleY(double scaleY) {
setScaleV(1.0 / scaleY); setScaleV(1.0 / scaleY);
@ -401,14 +463,19 @@ public class AppearanceBuilder extends AbstractChangeSource {
* @param rotation the new value for rotation in template * @param rotation the new value for rotation in template
*/ */
public void setRotation(double rotation) { public void setRotation(double rotation) {
for (AppearanceBuilder listener : configListeners.values()) {
listener.setRotation(rotation);
}
this.rotation = rotation; this.rotation = rotation;
fireChangeEvent(); if (!bypassAppearanceChangeEvent) {
fireChangeEvent();
}
} }
/** /**
* gets the current image in template * gets the current image in template
* *
* @param the current image in template * @return the current image in template
*/ */
public DecalImage getImage() { public DecalImage getImage() {
return image; return image;
@ -421,8 +488,13 @@ public class AppearanceBuilder extends AbstractChangeSource {
* @param image the new image to be used as template * @param image the new image to be used as template
*/ */
public void setImage(DecalImage image) { public void setImage(DecalImage image) {
for (AppearanceBuilder listener : configListeners.values()) {
listener.setImage(image);
}
this.image = image; this.image = image;
fireChangeEvent(); if (!bypassAppearanceChangeEvent) {
fireChangeEvent();
}
} }
/** /**
@ -441,8 +513,13 @@ public class AppearanceBuilder extends AbstractChangeSource {
* @param edgeMode the new edgeMode to be used * @param edgeMode the new edgeMode to be used
*/ */
public void setEdgeMode(Decal.EdgeMode edgeMode) { public void setEdgeMode(Decal.EdgeMode edgeMode) {
for (AppearanceBuilder listener : configListeners.values()) {
listener.setEdgeMode(edgeMode);
}
this.edgeMode = edgeMode; this.edgeMode = edgeMode;
fireChangeEvent(); if (!bypassAppearanceChangeEvent) {
fireChangeEvent();
}
} }
/** /**
@ -455,15 +532,55 @@ public class AppearanceBuilder extends AbstractChangeSource {
} }
/** /**
* function that garantees that chenges event only occurs after all changes are made * function that guarantees that changes event only occurs after all changes are made
* *
* param r the functor to be executed * param r the functor to be executed
*/ */
public void batch(Runnable r) { public void batch(Runnable r) {
for (AppearanceBuilder listener : configListeners.values()) {
listener.batch(r);
}
batch = true; batch = true;
r.run(); r.run();
batch = false; batch = false;
fireChangeEvent(); if (!bypassAppearanceChangeEvent) {
fireChangeEvent();
}
}
/**
* Add a new config listener that will undergo the same configuration changes as this AppearanceBuilder.
* @param component the component to add as a config listener
* @param ab new AppearanceBuilder config listener
* @return true if listener was successfully added, false if not
*/
public boolean addConfigListener(RocketComponent component, AppearanceBuilder ab) {
if (component == null || ab == null) {
return false;
}
configListeners.put(component, ab);
ab.setBypassChangeEvent(true);
return true;
}
public void removeConfigListener(RocketComponent listener) {
configListeners.remove(listener);
listener.setBypassChangeEvent(false);
}
public void clearConfigListeners() {
for (AppearanceBuilder listener : configListeners.values()) {
listener.setBypassChangeEvent(false);
}
configListeners.clear();
}
public Map<RocketComponent, AppearanceBuilder> getConfigListeners() {
return configListeners;
}
public void setBypassChangeEvent(boolean newValue) {
this.bypassAppearanceChangeEvent = newValue;
} }
} }

View File

@ -123,7 +123,7 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
private Appearance appearance = null; private Appearance appearance = null;
// If true, component change events will not be fired // If true, component change events will not be fired
private boolean ignoreComponentChange = false; private boolean bypassComponentChangeEvent = false;
/** /**
@ -464,10 +464,6 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
* @param appearance * @param appearance
*/ */
public void setAppearance(Appearance appearance) { public void setAppearance(Appearance appearance) {
for (RocketComponent listener : configListeners) {
listener.setAppearance(appearance);
}
this.appearance = appearance; this.appearance = appearance;
if (this.appearance != null) { if (this.appearance != null) {
Decal d = this.appearance.getTexture(); Decal d = this.appearance.getTexture();
@ -581,9 +577,9 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
*/ */
public final void setMassOverridden(boolean o) { public final void setMassOverridden(boolean o) {
for (RocketComponent listener : configListeners) { for (RocketComponent listener : configListeners) {
listener.setIgnoreComponentChange(false); listener.setBypassChangeEvent(false);
listener.setMassOverridden(o); listener.setMassOverridden(o);
listener.setIgnoreComponentChange(false); listener.setBypassChangeEvent(false);
} }
if (massOverridden == o) { if (massOverridden == o) {
@ -655,9 +651,9 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
*/ */
public final void setCGOverridden(boolean o) { public final void setCGOverridden(boolean o) {
for (RocketComponent listener : configListeners) { for (RocketComponent listener : configListeners) {
listener.setIgnoreComponentChange(false); listener.setBypassChangeEvent(false);
listener.setCGOverridden(o); listener.setCGOverridden(o);
listener.setIgnoreComponentChange(true); listener.setBypassChangeEvent(true);
} }
if (cgOverridden == o) { if (cgOverridden == o) {
@ -806,9 +802,9 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
*/ */
public final void setName(String name) { public final void setName(String name) {
for (RocketComponent listener : configListeners) { for (RocketComponent listener : configListeners) {
listener.setIgnoreComponentChange(false); listener.setBypassChangeEvent(false);
listener.setName(name); listener.setName(name);
listener.setIgnoreComponentChange(true); listener.setBypassChangeEvent(true);
} }
if (this.name.equals(name)) { if (this.name.equals(name)) {
@ -1954,7 +1950,7 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
*/ */
protected void fireComponentChangeEvent(ComponentChangeEvent e) { protected void fireComponentChangeEvent(ComponentChangeEvent e) {
checkState(); checkState();
if (parent == null || ignoreComponentChange) { if (parent == null || bypassComponentChangeEvent) {
/* Ignore if root invalid. */ /* Ignore if root invalid. */
return; return;
} }
@ -1973,17 +1969,16 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
fireComponentChangeEvent(new ComponentChangeEvent(this, type)); fireComponentChangeEvent(new ComponentChangeEvent(this, type));
} }
public void setIgnoreComponentChange(boolean newValue) { public void setBypassChangeEvent(boolean newValue) {
this.ignoreComponentChange = newValue; this.bypassComponentChangeEvent = newValue;
} }
public boolean getIgnoreComponentChange() { public boolean getBypassComponentChangeEvent() {
return this.ignoreComponentChange; return this.bypassComponentChangeEvent;
} }
/** /**
* Add a new config listener that will undergo the same configuration changes as this.component. Listener must be * Add a new config listener that will undergo the same configuration changes as this.component.
* of the same class as this.component.
* @param listener new config listener * @param listener new config listener
* @return true if listener was successfully added, false if not * @return true if listener was successfully added, false if not
*/ */
@ -1992,18 +1987,18 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
return false; return false;
} }
configListeners.add(listener); configListeners.add(listener);
listener.setIgnoreComponentChange(true); listener.setBypassChangeEvent(true);
return true; return true;
} }
public void removeConfigListener(RocketComponent listener) { public void removeConfigListener(RocketComponent listener) {
configListeners.remove(listener); configListeners.remove(listener);
listener.setIgnoreComponentChange(false); listener.setBypassChangeEvent(false);
} }
public void clearConfigListeners() { public void clearConfigListeners() {
for (RocketComponent listener : configListeners) { for (RocketComponent listener : configListeners) {
listener.setIgnoreComponentChange(false); listener.setBypassChangeEvent(false);
} }
configListeners.clear(); configListeners.clear();
} }

View File

@ -3,6 +3,9 @@ package net.sf.openrocket.gui.configdialog;
import java.awt.Color; import java.awt.Color;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.EventObject; import java.util.EventObject;
@ -58,7 +61,7 @@ import net.sf.openrocket.util.LineStyle;
import net.sf.openrocket.util.StateChangeListener; import net.sf.openrocket.util.StateChangeListener;
import net.sf.openrocket.gui.widgets.SelectColorButton; import net.sf.openrocket.gui.widgets.SelectColorButton;
public class AppearancePanel extends JPanel { public class AppearancePanel extends JPanel implements WindowListener {
private static final long serialVersionUID = 2709187552673202019L; private static final long serialVersionUID = 2709187552673202019L;
private static final Translator trans = Application.getTranslator(); private static final Translator trans = Application.getTranslator();
@ -107,6 +110,34 @@ public class AppearancePanel extends JPanel {
private static final JColorChooser colorChooser = new JColorChooser(); private static final JColorChooser colorChooser = new JColorChooser();
@Override
public void windowOpened(WindowEvent e) {}
@Override
public void windowClosing(WindowEvent e) {}
@Override
public void windowClosed(WindowEvent e) {
if (ab != null) {
ab.clearConfigListeners();
}
if (insideAb != null) {
insideAb.clearConfigListeners();
}
}
@Override
public void windowIconified(WindowEvent e) {}
@Override
public void windowDeiconified(WindowEvent e) {}
@Override
public void windowActivated(WindowEvent e) {}
@Override
public void windowDeactivated(WindowEvent e) {}
private class ColorActionListener implements ActionListener { private class ColorActionListener implements ActionListener {
private final String valueName; private final String valueName;
private final Object o; private final Object o;
@ -198,23 +229,44 @@ public class AppearancePanel extends JPanel {
previousUserSelectedAppearance = c.getAppearance(); previousUserSelectedAppearance = c.getAppearance();
if (previousUserSelectedAppearance == null) { if (previousUserSelectedAppearance == null) {
previousUserSelectedAppearance = new AppearanceBuilder() previousUserSelectedAppearance = new AppearanceBuilder().getAppearance();
.getAppearance();
ab = new AppearanceBuilder(defaultAppearance); ab = new AppearanceBuilder(defaultAppearance);
} else { } else {
ab = new AppearanceBuilder(previousUserSelectedAppearance); ab = new AppearanceBuilder(previousUserSelectedAppearance);
} }
for (RocketComponent listener : c.getConfigListeners()) {
Appearance a = listener.getAppearance();
AppearanceBuilder appearanceBuilder = new AppearanceBuilder(a);
ab.addConfigListener(listener, appearanceBuilder);
}
if (c instanceof InsideColorComponent) { // Check if all InsideColorComponent
boolean allInsideColor = c instanceof InsideColorComponent;
if (allInsideColor) {
for (RocketComponent listener : c.getConfigListeners()) {
if (!(listener instanceof InsideColorComponent)) {
allInsideColor = false;
break;
}
}
}
if (allInsideColor) {
previousUserSelectedInsideAppearance = ((InsideColorComponent) c).getInsideColorComponentHandler() previousUserSelectedInsideAppearance = ((InsideColorComponent) c).getInsideColorComponentHandler()
.getInsideAppearance(); .getInsideAppearance();
if (previousUserSelectedInsideAppearance == null) { if (previousUserSelectedInsideAppearance == null) {
previousUserSelectedInsideAppearance = new AppearanceBuilder() previousUserSelectedInsideAppearance = new AppearanceBuilder().getAppearance();
.getAppearance();
insideAb = new AppearanceBuilder(defaultAppearance); insideAb = new AppearanceBuilder(defaultAppearance);
} else { } else {
insideAb = new AppearanceBuilder(previousUserSelectedInsideAppearance); insideAb = new AppearanceBuilder(previousUserSelectedInsideAppearance);
} }
for (RocketComponent listener : c.getConfigListeners()) {
Appearance a = ((InsideColorComponent) listener).getInsideColorComponentHandler()
.getInsideAppearance();
AppearanceBuilder appearanceBuilder = new AppearanceBuilder(a);
insideAb.addConfigListener(listener, appearanceBuilder);
}
} }
net.sf.openrocket.util.Color figureColor = c.getColor(); net.sf.openrocket.util.Color figureColor = c.getColor();
@ -317,7 +369,7 @@ public class AppearancePanel extends JPanel {
add(new JSeparator(SwingConstants.HORIZONTAL), "span, wrap, growx"); add(new JSeparator(SwingConstants.HORIZONTAL), "span, wrap, growx");
// Display a tabbed panel for choosing the outside and inside appearance, if the object is of type InsideColorComponent // Display a tabbed panel for choosing the outside and inside appearance, if the object is of type InsideColorComponent
if (c instanceof InsideColorComponent) { if (allInsideColor) {
InsideColorComponentHandler handler = ((InsideColorComponent)c).getInsideColorComponentHandler(); InsideColorComponentHandler handler = ((InsideColorComponent)c).getInsideColorComponentHandler();
// Get translator keys // Get translator keys
@ -464,13 +516,31 @@ public class AppearancePanel extends JPanel {
previousUserSelectedInsideAppearance = (builder == null) ? null previousUserSelectedInsideAppearance = (builder == null) ? null
: builder.getAppearance(); : builder.getAppearance();
} }
// Set the listeners' appearance to the default appearance
for (RocketComponent listener : builder.getConfigListeners().keySet()) {
builder.getConfigListeners().get(listener).setAppearance(defaultAppearance);
listener.setAppearance(null);
}
// Set this component's appearance to the default appearance
builder.setAppearance(defaultAppearance); builder.setAppearance(defaultAppearance);
c.setAppearance(null); c.setAppearance(null);
} else { } else {
if (!insideBuilder) if (!insideBuilder) {
// Set the listeners' appearance to the previous user selected appearance
for (AppearanceBuilder listener : builder.getConfigListeners().values()) {
listener.setAppearance(previousUserSelectedAppearance);
}
builder.setAppearance(previousUserSelectedAppearance); builder.setAppearance(previousUserSelectedAppearance);
else }
else {
// Set the listeners' inside appearance to the previous user selected appearance
for (AppearanceBuilder listener : builder.getConfigListeners().values()) {
listener.setAppearance(previousUserSelectedInsideAppearance);
}
builder.setAppearance(previousUserSelectedInsideAppearance); builder.setAppearance(previousUserSelectedInsideAppearance);
}
} }
} }
}); });
@ -622,10 +692,24 @@ public class AppearancePanel extends JPanel {
opacityModel.stateChanged(null); opacityModel.stateChanged(null);
lastOpacity = builder.getOpacity(); lastOpacity = builder.getOpacity();
} }
if (!insideBuilder) if (!insideBuilder) {
// Set the listeners' outside appearance
for (RocketComponent listener : builder.getConfigListeners().keySet()) {
listener.setAppearance(builder.getConfigListeners().get(listener).getAppearance());
}
// Set this component's outside appearance
c.setAppearance(builder.getAppearance()); c.setAppearance(builder.getAppearance());
else }
((InsideColorComponent)c).getInsideColorComponentHandler().setInsideAppearance(builder.getAppearance()); else {
// Set the listeners' inside appearance
for (RocketComponent listener : builder.getConfigListeners().keySet()) {
if (!(listener instanceof InsideColorComponent)) continue;
((InsideColorComponent) listener).getInsideColorComponentHandler()
.setInsideAppearance(builder.getConfigListeners().get(listener).getAppearance());
}
// Set this component's inside appearance
((InsideColorComponent) c).getInsideColorComponentHandler().setInsideAppearance(builder.getAppearance());
}
decalModel.refresh(); decalModel.refresh();
} }
}); });

View File

@ -101,11 +101,16 @@ public class ComponentConfigDialog extends JDialog implements ComponentChangeLis
this.setContentPane(configurator); this.setContentPane(configurator);
configurator.updateFields(); configurator.updateFields();
// Set the selected tab List<RocketComponent> listeners = component.getConfigListeners();
configurator.setSelectedTab(previousSelectedTab);
// Set the default tab to 'Appearance' for a different-type multi-comp dialog (this is the most prominent use case)
if (listeners != null && listeners.size() > 0 && !component.checkAllClassesEqual(listeners)) {
configurator.setSelectedTabIndex(1);
} else {
configurator.setSelectedTab(previousSelectedTab);
}
//// configuration //// configuration
List<RocketComponent> listeners = component.getConfigListeners();
if (component.checkAllClassesEqual(listeners)) { if (component.checkAllClassesEqual(listeners)) {
if (listeners != null && listeners.size() > 0) { if (listeners != null && listeners.size() > 0) {
setTitle("(" + trans.get("ComponentCfgDlg.MultiComponent") + ") " + setTitle("(" + trans.get("ComponentCfgDlg.MultiComponent") + ") " +

View File

@ -133,11 +133,6 @@ public class RocketComponentConfig extends JPanel {
tabbedPane.addTab(trans.get("RocketCompCfg.tab.Comment"), null, commentTab(), tabbedPane.addTab(trans.get("RocketCompCfg.tab.Comment"), null, commentTab(),
trans.get("RocketCompCfg.tab.Specifyacomment")); trans.get("RocketCompCfg.tab.Specifyacomment"));
// Set the default tab to 'Appearance' for a different-type multi-comp dialog (this is the most prominent use case)
if (listeners != null && listeners.size() > 0 && !allSameType) {
tabbedPane.setSelectedIndex(1);
}
addButtons(); addButtons();
updateFields(); updateFields();
@ -329,6 +324,12 @@ public class RocketComponentConfig extends JPanel {
} }
} }
public void setSelectedTabIndex(int index) {
if (tabbedPane != null) {
tabbedPane.setSelectedIndex(index);
}
}
public void setSelectedTab(String tabName) { public void setSelectedTab(String tabName) {
if (tabbedPane != null) { if (tabbedPane != null) {
for (int i = 0; i < tabbedPane.getTabCount(); i++) { for (int i = 0; i < tabbedPane.getTabCount(); i++) {