diff --git a/java_tools/ts_plugin/build.xml b/java_tools/ts_plugin/build.xml new file mode 100644 index 0000000000..3fb1b96e96 --- /dev/null +++ b/java_tools/ts_plugin/build.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/java_tools/ts_plugin/src/com/rusefi/Content.java b/java_tools/ts_plugin/src/com/rusefi/Content.java new file mode 100644 index 0000000000..38cb552996 --- /dev/null +++ b/java_tools/ts_plugin/src/com/rusefi/Content.java @@ -0,0 +1,130 @@ +package com.rusefi; + +import com.efiAnalytics.plugin.ecu.ControllerAccess; +import com.efiAnalytics.plugin.ecu.ControllerException; +import com.efiAnalytics.plugin.ecu.ControllerParameter; +import com.efiAnalytics.plugin.ecu.servers.ControllerParameterServer; +import com.rusefi.tools.online.Online; +import com.rusefi.tune.xml.Constant; +import com.rusefi.tune.xml.Msq; +import com.rusefi.ui.AuthTokenPanel; +import com.rusefi.ui.storage.PersistentConfiguration; + +import javax.swing.*; +import javax.xml.bind.JAXBException; +import java.awt.event.ActionEvent; +import java.io.IOException; +import java.util.Map; +import java.util.TreeMap; + +public class Content { + private final AuthTokenPanel tokenPanel = new AuthTokenPanel(); + private final JComponent content = new JPanel(); + + private ControllerAccess controllerAccess; + + public Content() { + content.add(tokenPanel.getContent()); + + JButton upload = new JButton("Upload Tune"); + upload.addActionListener(new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + Msq tune = writeCurrentTune(controllerAccess); + Online.uploadTune(tune, tokenPanel, content); + } + }); + content.add(upload); + + } + + public void close() { + PersistentConfiguration.getConfig().save(); + } + + private void printEcuConfigurationNames(ControllerAccess controllerAccess) { + for (String config : controllerAccess.getEcuConfigurationNames()) { + System.out.println("EcuConfigurationName " + config); + } + } + + private static String getArrayValue(double[][] arrayValues) { + StringBuilder sb = new StringBuilder(); + for (int rowIndex = 0; rowIndex < arrayValues.length; rowIndex++) { + double[] array = arrayValues[rowIndex]; + sb.append("\n\t"); + for (int colIndex = 0; colIndex < array.length; colIndex++) { + double value = array[colIndex]; + sb.append(' '); + sb.append(value); + } + } + sb.append("\n"); + return sb.toString(); + } + + public static String getConfigurationName() { + return ControllerAccess.getInstance().getEcuConfigurationNames()[0]; + } + + + private static String toString(double scalarValue, int decimalPlaces) { + // todo: start using decimalPlaces parameter! + return Double.toString(scalarValue); + } + + private static Msq writeCurrentTune(ControllerAccess controllerAccess) { + Msq msq = new Msq(); + String configurationName = getConfigurationName(); + ControllerParameterServer controllerParameterServer = controllerAccess.getControllerParameterServer(); + + Msq tsTune = TsTuneReader.readTsTune(configurationName); + Map byName = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + for (Constant c : tsTune.getPage().constant) { + byName.put(c.getName(), c); + } + + try { + String[] parameterNames = controllerParameterServer.getParameterNames(configurationName); + for (String parameterName : parameterNames) { + ControllerParameter cp = controllerParameterServer.getControllerParameter(configurationName, parameterName); + String type = cp.getParamClass(); + String value; + if (ControllerParameter.PARAM_CLASS_BITS.equals(type)) { + value = cp.getStringValue(); + System.out.println("TsPlugin bits " + parameterName + ": " + value); + } else if (ControllerParameter.PARAM_CLASS_SCALAR.equals(type)) { + value = toString(cp.getScalarValue(), cp.getDecimalPlaces()); + System.out.println("TsPlugin scalar " + parameterName + ": " + cp.getScalarValue() + "/" + cp.getStringValue()); + + } else if (ControllerParameter.PARAM_CLASS_ARRAY.equals(type)) { + value = getArrayValue(cp.getArrayValues()); + } else if ("string".equals(type)) { + //value = cp.getStringValue(); + // WOW hack + // TS does not provide values for string parameters?! so we read the file directly + Constant constant = byName.get(parameterName); + if (constant == null) { + System.out.println("Not found in TS tune " + parameterName); + value = null; + } else { + value = constant.getValue(); + System.out.println("TsPlugin name=" + parameterName + " string=" + cp.getStringValue() + "/h=" + value); + } + } else { + System.out.println("TsPlugin name=" + parameterName + " unexpected type " + type + "/" + cp.getStringValue()); + value = cp.getStringValue(); + } + + msq.getPage().constant.add(new Constant(parameterName, cp.getUnits(), value)); + } + + String fileName = Msq.outputXmlFileName; + msq.writeXmlFile(fileName); + return msq; + } catch (JAXBException | IOException | ControllerException e) { + System.out.println("Error writing XML: " + e); + return null; + } + } +} diff --git a/java_tools/ts_plugin_launcher/src/com/rusefi/TsTuneReader.java b/java_tools/ts_plugin/src/com/rusefi/TsTuneReader.java similarity index 100% rename from java_tools/ts_plugin_launcher/src/com/rusefi/TsTuneReader.java rename to java_tools/ts_plugin/src/com/rusefi/TsTuneReader.java diff --git a/java_tools/ts_plugin/ts_plugin.iml b/java_tools/ts_plugin/ts_plugin.iml new file mode 100644 index 0000000000..e6930cba9c --- /dev/null +++ b/java_tools/ts_plugin/ts_plugin.iml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/java_tools/ts_plugin_launcher/.idea/libraries/httpclient_javadoc.xml b/java_tools/ts_plugin_launcher/.idea/libraries/httpclient_javadoc.xml deleted file mode 100644 index 290bc3451e..0000000000 --- a/java_tools/ts_plugin_launcher/.idea/libraries/httpclient_javadoc.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/java_tools/ts_plugin_launcher/.idea/modules.xml b/java_tools/ts_plugin_launcher/.idea/modules.xml index 19e6e47e18..528d7cce98 100644 --- a/java_tools/ts_plugin_launcher/.idea/modules.xml +++ b/java_tools/ts_plugin_launcher/.idea/modules.xml @@ -7,6 +7,7 @@ + diff --git a/java_tools/ts_plugin_launcher/build.xml b/java_tools/ts_plugin_launcher/build.xml index 826491418e..76193b4a7e 100644 --- a/java_tools/ts_plugin_launcher/build.xml +++ b/java_tools/ts_plugin_launcher/build.xml @@ -1,6 +1,6 @@ - + @@ -14,10 +14,6 @@ destdir="build/classes" classpath="${console_path}/lib/junit.jar:${console_path}/lib/annotations.jar:lib/TunerStudioPluginAPI.jar:${console_path}/lib/httpclient.jar:${console_path}/lib/httpmime.jar:${console_path}/lib/httpcore.jar" > - - - - diff --git a/java_tools/ts_plugin_launcher/src/com/rusefi/TsPlugin.java b/java_tools/ts_plugin_launcher/src/com/rusefi/TsPlugin.java index a53560a97a..7a962731dd 100644 --- a/java_tools/ts_plugin_launcher/src/com/rusefi/TsPlugin.java +++ b/java_tools/ts_plugin_launcher/src/com/rusefi/TsPlugin.java @@ -2,48 +2,19 @@ package com.rusefi; import com.efiAnalytics.plugin.ApplicationPlugin; import com.efiAnalytics.plugin.ecu.ControllerAccess; -import com.efiAnalytics.plugin.ecu.ControllerException; -import com.efiAnalytics.plugin.ecu.ControllerParameter; -import com.efiAnalytics.plugin.ecu.servers.ControllerParameterServer; -import com.rusefi.tools.online.Online; -import com.rusefi.tune.xml.Constant; -import com.rusefi.tune.xml.Msq; -import com.rusefi.ui.AuthTokenPanel; -import com.rusefi.ui.storage.Node; -import com.rusefi.ui.storage.PersistentConfiguration; -import com.rusefi.ui.util.Misc; import org.putgemin.VerticalFlowLayout; import javax.swing.*; -import javax.xml.bind.JAXBException; -import java.awt.event.ActionEvent; -import java.io.IOException; -import java.util.Map; -import java.util.TreeMap; /** * by the way TS installs stuff into %user%\.efianalytics\TunerStudio\plugins folder */ public class TsPlugin implements ApplicationPlugin { - private ControllerAccess controllerAccess; + private static final String VERSION = "alpha2020"; private final JPanel content = new JPanel(new VerticalFlowLayout()); - private final AuthTokenPanel tokenPanel = new AuthTokenPanel(); - public TsPlugin() { - content.add(new JLabel("" + rusEFIVersion.CONSOLE_VERSION)); - content.add(Misc.getRusEFI_online_manual()); - content.add(tokenPanel.getContent()); - - JButton upload = new JButton("Upload"); - upload.addActionListener(new AbstractAction() { - @Override - public void actionPerformed(ActionEvent e) { - Msq tune = writeCurrentTune(controllerAccess); - Online.uploadTune(tune, tokenPanel, content); - } - }); - content.add(upload); + content.add(new JLabel("" + VERSION)); } @Override @@ -68,93 +39,6 @@ public class TsPlugin implements ApplicationPlugin { @Override public void initialize(ControllerAccess controllerAccess) { - this.controllerAccess = controllerAccess; - printEcuConfigurationNames(controllerAccess); - } - - private static Msq writeCurrentTune(ControllerAccess controllerAccess) { - Msq msq = new Msq(); - String configurationName = getConfigurationName(); - ControllerParameterServer controllerParameterServer = controllerAccess.getControllerParameterServer(); - - Msq tsTune = TsTuneReader.readTsTune(configurationName); - Map byName = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); - for (Constant c : tsTune.getPage().constant) { - byName.put(c.getName(), c); - } - - try { - String[] parameterNames = controllerParameterServer.getParameterNames(configurationName); - for (String parameterName : parameterNames) { - ControllerParameter cp = controllerParameterServer.getControllerParameter(configurationName, parameterName); - String type = cp.getParamClass(); - String value; - if (ControllerParameter.PARAM_CLASS_BITS.equals(type)) { - value = cp.getStringValue(); - System.out.println("TsPlugin bits " + parameterName + ": " + value); - } else if (ControllerParameter.PARAM_CLASS_SCALAR.equals(type)) { - value = toString(cp.getScalarValue(), cp.getDecimalPlaces()); - System.out.println("TsPlugin scalar " + parameterName + ": " + cp.getScalarValue() + "/" + cp.getStringValue()); - - } else if (ControllerParameter.PARAM_CLASS_ARRAY.equals(type)) { - value = getArrayValue(cp.getArrayValues()); - } else if ("string".equals(type)) { - //value = cp.getStringValue(); - // WOW hack - // TS does not provide values for string parameters?! so we read the file directly - Constant constant = byName.get(parameterName); - if (constant == null) { - System.out.println("Not found in TS tune " + parameterName); - value = null; - } else { - value = constant.getValue(); - System.out.println("TsPlugin name=" + parameterName + " string=" + cp.getStringValue() + "/h=" + value); - } - } else { - System.out.println("TsPlugin name=" + parameterName + " unexpected type " + type + "/" + cp.getStringValue()); - value = cp.getStringValue(); - } - - msq.getPage().constant.add(new Constant(parameterName, cp.getUnits(), value)); - } - - String fileName = Msq.outputXmlFileName; - msq.writeXmlFile(fileName); - return msq; - } catch (JAXBException | IOException | ControllerException e) { - System.out.println("Error writing XML: " + e); - return null; - } - } - - private static String toString(double scalarValue, int decimalPlaces) { - // todo: start using decimalPlaces parameter! - return Double.toString(scalarValue); - } - - private void printEcuConfigurationNames(ControllerAccess controllerAccess) { - for (String config : controllerAccess.getEcuConfigurationNames()) { - System.out.println("EcuConfigurationName " + config); - } - } - - private static String getArrayValue(double[][] arrayValues) { - StringBuilder sb = new StringBuilder(); - for (int rowIndex = 0; rowIndex < arrayValues.length; rowIndex++) { - double[] array = arrayValues[rowIndex]; - sb.append("\n\t"); - for (int colIndex = 0; colIndex < array.length; colIndex++) { - double value = array[colIndex]; - sb.append(' '); - sb.append(value); - } - } - sb.append("\n"); - return sb.toString(); - } - - public static String getConfigurationName() { - return ControllerAccess.getInstance().getEcuConfigurationNames()[0]; } @Override @@ -181,7 +65,6 @@ public class TsPlugin implements ApplicationPlugin { @Override public void close() { System.out.printf("TsPlugin#close"); - PersistentConfiguration.getConfig().save(); } @Override @@ -191,7 +74,7 @@ public class TsPlugin implements ApplicationPlugin { @Override public String getVersion() { - return Integer.toString(rusEFIVersion.CONSOLE_VERSION); + return VERSION; } @Override diff --git a/java_tools/ts_plugin_launcher/src/org/putgemin/VerticalFlowLayout.java b/java_tools/ts_plugin_launcher/src/org/putgemin/VerticalFlowLayout.java new file mode 100644 index 0000000000..16f31d61cd --- /dev/null +++ b/java_tools/ts_plugin_launcher/src/org/putgemin/VerticalFlowLayout.java @@ -0,0 +1,589 @@ +package org.putgemin; +/* + * @(#)VerticalFlowLayout.java 1.52 03/12/19 + * + * Copyright 2004 Sun Microsystems, Inc. All rights reserved. + * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. + */ + +import java.awt.Component; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.Insets; +import java.awt.LayoutManager; +import java.io.ObjectInputStream; +import java.io.IOException; + +/** + * A flow layout arranges components in a directional flow, much + * like lines of text in a paragraph. The flow direction is + * determined by the container's componentOrientation + * property and may be one of two values: + *
    + *
  • ComponentOrientation.TOP_TO_BOTTOM + *
  • ComponentOrientation.BOTTOM_TO_TOP + *
+ * VerticalFlow layouts are typically used + * to arrange buttons in a panel. It arranges buttons + * horizontally until no more buttons fit on the same line. + * The line alignment is determined by the align + * property. The possible values are: + *
    + *
  • {@link #TOP TOP} + *
  • {@link #BOTTOM BOTTOM} + *
  • {@link #CENTER CENTER} + *
  • {@link #LEADING LEADING} + *
  • {@link #TRAILING TRAILING} + *
+ *

+ * For example, the following picture shows an applet using the flow + * layout manager (its default layout manager) to position three buttons: + *

+ * Graphic of Layout for Three Buttons + *

+ * Here is the code for this applet: + *

+ *


+ * import java.awt.*;
+ * import java.applet.Applet;
+ * 

+ * public class myButtons extends Applet { + * Button button1, button2, button3; + * public void init() { + * button1 = new Button("Ok"); + * button2 = new Button("Open"); + * button3 = new Button("Close"); + * add(button1); + * add(button2); + * add(button3); + * } + * } + *


+ *

+ * A flow layout lets each component assume its natural (preferred) size. + * + * @author Arthur van Hoff + * @author Sami Shaio + * @version 1.52, 12/19/03 + * @see java.awt.ComponentOrientation + * @since JDK1.0 + */ +public class VerticalFlowLayout implements LayoutManager, java.io.Serializable { + + private boolean maximizeOtherDimension = false; + + public void setMaximizeOtherDimension(boolean max) { + maximizeOtherDimension = max; + } + + public boolean isMaximizeOtherDimension() { + return maximizeOtherDimension; + } + + /** + * This value indicates that each row of components + * should be left-justified. + */ + public static final int TOP = 0; + + /** + * This value indicates that each row of components + * should be centered. + */ + public static final int CENTER = 1; + + /** + * This value indicates that each row of components + * should be right-justified. + */ + public static final int BOTTOM = 2; + + /** + * This value indicates that each row of components + * should be justified to the leading edge of the container's + * orientation, for example, to the left in left-to-right orientations. + * + * @see java.awt.Component#getComponentOrientation + * @see java.awt.ComponentOrientation + * @since 1.2 + * Package-private pending API change approval + */ + public static final int LEADING = 3; + + /** + * This value indicates that each row of components + * should be justified to the trailing edge of the container's + * orientation, for example, to the right in left-to-right orientations. + * + * @see java.awt.Component#getComponentOrientation + * @see java.awt.ComponentOrientation + * @since 1.2 + * Package-private pending API change approval + */ + public static final int TRAILING = 4; + + /** + * align is the property that determines + * how each row distributes empty space. + * It can be one of the following values: + *

    + * TOP + * BOTTOM + * CENTER + * LEADING + * TRAILING + *
+ * + * @serial + * @see #getAlignment + * @see #setAlignment + */ + int align; // This is for 1.1 serialization compatibility + + /** + * newAlign is the property that determines + * how each row distributes empty space for the Java 2 platform, + * v1.2 and greater. + * It can be one of the following three values: + *
    + * TOP + * BOTTOM + * CENTER + * LEADING + * TRAILING + *
+ * + * @serial + * @see #getAlignment + * @see #setAlignment + * @since 1.2 + */ + int newAlign; // This is the one we actually use + + /** + * The flow layout manager allows a seperation of + * components with gaps. The horizontal gap will + * specify the space between components and between + * the components and the borders of the + * Container. + * + * @serial + * @see #getHgap() + * @see #setHgap(int) + */ + int hgap; + + /** + * The flow layout manager allows a seperation of + * components with gaps. The vertical gap will + * specify the space between rows and between the + * the rows and the borders of the Container. + * + * @serial + * @see #getHgap() + * @see #setHgap(int) + */ + int vgap; + + /* + * JDK 1.1 serialVersionUID + */ + private static final long serialVersionUID = -7262534875583282631L; + + /** + * Constructs a new VerticalFlowLayout with a centered alignment and a + * default 5-unit horizontal and vertical gap. + */ + public VerticalFlowLayout() { + this(CENTER, 5, 5); + } + + /** + * Constructs a new VerticalFlowLayout with the specified + * alignment and a default 5-unit horizontal and vertical gap. + * The value of the alignment argument must be one of + * VerticalFlowLayout.TOP, VerticalFlowLayout.BOTTOM, + * VerticalFlowLayout.CENTER, VerticalFlowLayout.LEADING, + * or VerticalFlowLayout.TRAILING. + * + * @param align the alignment value + */ + public VerticalFlowLayout(int align) { + this(align, 5, 5); + } + + /** + * Creates a new flow layout manager with the indicated alignment + * and the indicated horizontal and vertical gaps. + *

+ * The value of the alignment argument must be one of + * VerticalFlowLayout.TOP, VerticalFlowLayout.BOTTOM, + * VerticalFlowLayout.CENTER, VerticalFlowLayout.LEADING, + * or VerticalFlowLayout.TRAILING. + * + * @param align the alignment value + * @param hgap the horizontal gap between components + * and between the components and the + * borders of the Container + * @param vgap the vertical gap between components + * and between the components and the + * borders of the Container + */ + public VerticalFlowLayout(int align, int hgap, int vgap) { + this.hgap = hgap; + this.vgap = vgap; + setAlignment(align); + } + + /** + * Gets the alignment for this layout. + * Possible values are VerticalFlowLayout.TOP, + * VerticalFlowLayout.BOTTOM, VerticalFlowLayout.CENTER, + * VerticalFlowLayout.LEADING, + * or VerticalFlowLayout.TRAILING. + * + * @return the alignment value for this layout + * @since JDK1.1 + */ + public int getAlignment() { + return newAlign; + } + + /** + * Sets the alignment for this layout. + * Possible values are + *

    + *
  • VerticalFlowLayout.TOP + *
  • VerticalFlowLayout.BOTTOM + *
  • VerticalFlowLayout.CENTER + *
  • VerticalFlowLayout.LEADING + *
  • VerticalFlowLayout.TRAILING + *
+ * + * @param align one of the alignment values shown above + * @see #getAlignment() + * @since JDK1.1 + */ + public void setAlignment(int align) { + this.newAlign = align; + + // this.align is used only for serialization compatibility, + // so set it to a value compatible with the 1.1 version + // of the class + + switch (align) { + case LEADING: + this.align = TOP; + break; + case TRAILING: + this.align = BOTTOM; + break; + default: + this.align = align; + break; + } + } + + /** + * Gets the horizontal gap between components + * and between the components and the borders + * of the Container + * + * @return the horizontal gap between components + * and between the components and the borders + * of the Container + */ + public int getHgap() { + return hgap; + } + + /** + * Sets the horizontal gap between components and + * between the components and the borders of the + * Container. + * + * @param hgap the horizontal gap between components + * and between the components and the borders + * of the Container + */ + public void setHgap(int hgap) { + this.hgap = hgap; + } + + /** + * Gets the vertical gap between components and + * between the components and the borders of the + * Container. + * + * @return the vertical gap between components + * and between the components and the borders + * of the Container + */ + public int getVgap() { + return vgap; + } + + /** + * Sets the vertical gap between components and between + * the components and the borders of the Container. + * + * @param vgap the vertical gap between components + * and between the components and the borders + * of the Container + */ + public void setVgap(int vgap) { + this.vgap = vgap; + } + + /** + * Adds the specified component to the layout. + * Not used by this class. + * + * @param name the name of the component + * @param comp the component to be added + */ + public void addLayoutComponent(String name, Component comp) { + } + + /** + * Removes the specified component from the layout. + * Not used by this class. + * + * @param comp the component to remove + * @see java.awt.Container#removeAll + */ + public void removeLayoutComponent(Component comp) { + } + + /** + * Returns the preferred dimensions for this layout given the + * visible components in the specified target container. + * + * @param target the container that needs to be laid out + * @return the preferred dimensions to lay out the + * subcomponents of the specified container + * @see Container + * @see #minimumLayoutSize + * @see java.awt.Container#getPreferredSize + */ + public Dimension preferredLayoutSize(Container target) { + synchronized (target.getTreeLock()) { + Dimension dim = new Dimension(0, 0); + int nmembers = target.getComponentCount(); + boolean firstVisibleComponent = true; + + for (int i = 0; i < nmembers; i++) { + Component m = target.getComponent(i); + if (m.isVisible()) { + Dimension d = m.getPreferredSize(); + dim.width = Math.max(dim.width, d.width); + if (firstVisibleComponent) { + firstVisibleComponent = false; + } else { + dim.height += vgap; + } + dim.height += d.height; + } + } + + Insets insets = target.getInsets(); + dim.width += insets.left + insets.right + hgap * 2; + dim.height += insets.top + insets.bottom + vgap * 2; + return dim; + } + } + + /** + * Returns the minimum dimensions needed to layout the visible + * components contained in the specified target container. + * + * @param target the container that needs to be laid out + * @return the minimum dimensions to lay out the + * subcomponents of the specified container + * @see #preferredLayoutSize + * @see java.awt.Container + * @see java.awt.Container#doLayout + */ + public Dimension minimumLayoutSize(Container target) { + synchronized (target.getTreeLock()) { + Dimension dim = new Dimension(0, 0); + int nmembers = target.getComponentCount(); + + for (int i = 0; i < nmembers; i++) { + Component m = target.getComponent(i); + if (m.isVisible()) { + Dimension d = m.getMinimumSize(); + dim.width = Math.max(dim.width, d.width); + if (i > 0) { + dim.height += vgap; + } + dim.height += d.height; + } + } + Insets insets = target.getInsets(); + dim.width += insets.left + insets.right + hgap * 2; + dim.height += insets.top + insets.bottom + vgap * 2; + return dim; + } + } + + /** + * Centers the elements in the specified row, if there is any slack. + * + * @param target the component which needs to be moved + * @param x the x coordinate + * @param y the y coordinate + * @param width the width dimensions + * @param height the height dimensions + * @param colStart the beginning of the row + * @param colEnd the the ending of the row + */ + private void moveComponents(Container target, int x, int y, int width, int height, + int colStart, int colEnd, boolean ltr) { + synchronized (target.getTreeLock()) { + switch (newAlign) { + case TOP: + y += ltr ? 0 : height; + break; + case CENTER: + y += height / 2; + break; + case BOTTOM: + y += ltr ? height : 0; + break; + case LEADING: + break; + case TRAILING: + y += height; + break; + } + for (int i = colStart; i < colEnd; i++) { + Component m = target.getComponent(i); + if (m.isVisible()) { + if (ltr) { + m.setLocation(x + (width - m.getWidth()) / 2, y); + } else { + m.setLocation(x + (width - m.getWidth()) / 2, target.getHeight() - y - m.getHeight()); + } + y += m.getHeight() + vgap; + } + } + } + } + + /** + * Lays out the container. This method lets each + * visible component take + * its preferred size by reshaping the components in the + * target container in order to satisfy the alignment of + * this VerticalFlowLayout object. + * + * @param target the specified component being laid out + * @see Container + * @see java.awt.Container#doLayout + */ + public void layoutContainer(Container target) { + synchronized (target.getTreeLock()) { + Insets insets = target.getInsets(); + int maxwidth = target.getWidth() - (insets.left + insets.right + hgap * 2); + int maxheight = target.getHeight() - (insets.top + insets.bottom + vgap * 2); + int nmembers = target.getComponentCount(); + int x = insets.left + hgap, y = 0; + int colw = 0, start = 0; + + boolean ltr = target.getComponentOrientation().isLeftToRight(); + + for (int i = 0; i < nmembers; i++) { + Component m = target.getComponent(i); + if (m.isVisible()) { + Dimension d = m.getPreferredSize(); + if (maximizeOtherDimension) { + d.width = maxwidth; + } + m.setSize(d.width, d.height); + + if ((y == 0) || ((y + d.height) <= maxheight)) { + if (y > 0) { + y += vgap; + } + y += d.height; + colw = Math.max(colw, d.width); + } else { + moveComponents(target, insets.left + hgap, y, maxheight - x, colw, start, i, ltr); + moveComponents(target, x, insets.top + vgap, colw, maxheight - y, start, i, ltr); + y = d.height; + x += hgap + colw; + colw = d.width; + start = i; + } + } + } + moveComponents(target, x, insets.top + vgap, colw, maxheight - y, start, nmembers, ltr); + } + } + + // + // the internal serial version which says which version was written + // - 0 (default) for versions before the Java 2 platform, v1.2 + // - 1 for version >= Java 2 platform v1.2, which includes "newAlign" field + // + private static final int currentSerialVersion = 1; + /** + * This represent the currentSerialVersion + * which is bein used. It will be one of two values : + * 0 versions before Java 2 platform v1.2.. + * 1 versions after Java 2 platform v1.2.. + * + * @serial + * @since 1.2 + */ + private int serialVersionOnStream = currentSerialVersion; + + /** + * Reads this object out of a serialization stream, handling + * objects written by older versions of the class that didn't contain all + * of the fields we use now.. + */ + private void readObject(ObjectInputStream stream) + throws IOException, ClassNotFoundException { + stream.defaultReadObject(); + + if (serialVersionOnStream < 1) { + // "newAlign" field wasn't present, so use the old "align" field. + setAlignment(this.align); + } + serialVersionOnStream = currentSerialVersion; + } + + /** + * Returns a string representation of this VerticalFlowLayout + * object and its values. + * + * @return a string representation of this layout + */ + public String toString() { + String str = ""; + switch (align) { + case TOP: + str = ",align=top"; + break; + case CENTER: + str = ",align=center"; + break; + case BOTTOM: + str = ",align=bottom"; + break; + case LEADING: + str = ",align=leading"; + break; + case TRAILING: + str = ",align=trailing"; + break; + } + return getClass().getName() + "[hgap=" + hgap + ",vgap=" + vgap + str + "]"; + } + + +} \ No newline at end of file diff --git a/java_tools/ts_plugin_launcher/ts_plugin_launcher.iml b/java_tools/ts_plugin_launcher/ts_plugin_launcher.iml index a6d1bc0c72..a3a4e1a20b 100644 --- a/java_tools/ts_plugin_launcher/ts_plugin_launcher.iml +++ b/java_tools/ts_plugin_launcher/ts_plugin_launcher.iml @@ -8,9 +8,5 @@ - - - -
\ No newline at end of file