diff --git a/diylc/diylc-core/src/org/diylc/presenter/DrawingCache.java b/diylc/diylc-core/src/org/diylc/presenter/DrawingCache.java index 24656fdc..bd22ad83 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/DrawingCache.java +++ b/diylc/diylc-core/src/org/diylc/presenter/DrawingCache.java @@ -68,7 +68,7 @@ public class DrawingCache { ComponentType type = ComponentProcessor.getInstance() .extractComponentTypeFrom((Class>) x.getKey().getClass()); - if (type.getEnableCache()) { + if (type != null && type.getEnableCache()) { renderAndCache(x.getKey(), g2d, x.getValue(), outlineMode, project, zoom); } }); @@ -91,7 +91,7 @@ public class DrawingCache { ComponentType type = ComponentProcessor.getInstance() .extractComponentTypeFrom((Class>) component.getClass()); - if (type.getEnableCache()) { + if (type != null && type.getEnableCache()) { // if we need to apply caching Point firstPoint = component.getControlPoint(0); diff --git a/diylc/diylc-core/src/org/diylc/presenter/Presenter.java b/diylc/diylc-core/src/org/diylc/presenter/Presenter.java index 7558e054..85e1e460 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/Presenter.java +++ b/diylc/diylc-core/src/org/diylc/presenter/Presenter.java @@ -50,7 +50,6 @@ import java.util.TreeMap; import javax.swing.JOptionPane; import org.apache.log4j.Logger; -import org.diylc.appframework.miscutils.ConfigurationManager; import org.diylc.appframework.miscutils.IConfigurationManager; import org.diylc.appframework.miscutils.JarScanner; import org.diylc.appframework.miscutils.Utils; @@ -496,6 +495,9 @@ public class Presenter implements IPlugInPort { ComponentType componentType = ComponentProcessor.getInstance().extractComponentTypeFrom( (Class>) component.getClass()); + // for internal types + if (componentType == null) + return true; return !currentProject.getHiddenLayers().contains((int) Math.round(componentType.getZOrder())); } @@ -1075,7 +1077,7 @@ public class Presenter implements IPlugInPort { ComponentType type = ComponentProcessor.getInstance().extractComponentTypeFrom((Class>) c.getClass()); if ((c.getName() != null && c.getName().toLowerCase().matches(criteria.toLowerCase())) || (c.getValueForDisplay() != null && c.getValueForDisplay().toLowerCase().matches(criteria.toLowerCase())) || - type.getName().toLowerCase().matches(criteria.toLowerCase())) + (type != null && type.getName().toLowerCase().matches(criteria.toLowerCase()))) matching.add(c); } updateSelection(matching); @@ -2830,6 +2832,9 @@ public class Presenter implements IPlugInPort { ComponentType componentType = ComponentProcessor.getInstance().extractComponentTypeFrom( (Class>) component.getClass()); + // for internal-use components + if (componentType == null) + return false; return currentProject.getLockedLayers().contains((int) Math.round(componentType.getZOrder())) || currentProject.getLockedComponents().contains(component); } diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index 6f6dd1dc..e4eda30d 100644 Binary files a/diylc/diylc-library/lib/diylc-core.jar and b/diylc/diylc-library/lib/diylc-core.jar differ diff --git a/diylc/diylc-library/src/org/diylc/components/misc/LoadlineCurve.java b/diylc/diylc-library/src/org/diylc/components/misc/LoadlineCurve.java new file mode 100644 index 00000000..2832c9b1 --- /dev/null +++ b/diylc/diylc-library/src/org/diylc/components/misc/LoadlineCurve.java @@ -0,0 +1,53 @@ +package org.diylc.components.misc; + +import java.awt.Color; +import java.awt.Font; +import java.awt.Graphics2D; +import java.awt.Point; + +import org.diylc.awt.StringUtils; +import org.diylc.common.HorizontalAlignment; +import org.diylc.common.VerticalAlignment; +import org.diylc.components.connectivity.CurvedTrace; +import org.diylc.core.ComponentState; +import org.diylc.core.IDrawingObserver; +import org.diylc.core.Project; +import org.diylc.core.annotations.EditableProperty; +import org.diylc.core.measures.Size; +import org.diylc.core.measures.SizeUnit; +import org.diylc.core.measures.Voltage; + +public class LoadlineCurve extends CurvedTrace { + + private static final long serialVersionUID = 1L; + + private static final Size LABEL_SPACING = new Size(1d, SizeUnit.mm); + + private Voltage voltage; + + @Override + public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, + Project project, IDrawingObserver drawingObserver) { + super.draw(g2d, componentState, outlineMode, project, drawingObserver); + if (getVoltage() == null) + return; + g2d.setColor(Color.black); + Font oldFont = g2d.getFont(); + g2d.setFont(project.getFont().deriveFont(12f).deriveFont(Font.BOLD)); + Point lastPoint = getControlPoint(getControlPointCount() - 1); + int spacing = (int) LABEL_SPACING.convertToPixels(); + int x = lastPoint.x + spacing; + int y = lastPoint.y - spacing; + StringUtils.drawCenteredText(g2d, getVoltage().toString(), x, y, HorizontalAlignment.LEFT, VerticalAlignment.TOP); + g2d.setFont(oldFont); + } + + @EditableProperty + public Voltage getVoltage() { + return voltage; + } + + public void setVoltage(Voltage voltage) { + this.voltage = voltage; + } +} diff --git a/diylc/diylc-library/src/org/diylc/components/misc/LoadlineEntity.java b/diylc/diylc-library/src/org/diylc/components/misc/LoadlineEntity.java index 48e76139..4a5d8df1 100644 --- a/diylc/diylc-library/src/org/diylc/components/misc/LoadlineEntity.java +++ b/diylc/diylc-library/src/org/diylc/components/misc/LoadlineEntity.java @@ -25,10 +25,6 @@ import java.awt.geom.Point2D; import java.io.Serializable; import java.util.List; -import org.diylc.core.measures.Current; -import org.diylc.core.measures.Power; -import org.diylc.core.measures.Voltage; - /** * Represents a complete load characteristics, used for tubes and transistors. * @@ -39,9 +35,9 @@ public class LoadlineEntity implements Serializable { private static final long serialVersionUID = 1L; private String name; - private Power maxDissipation; - private Voltage maxVoltage; - private Current maxCurrent; + private double maxDissipation; + private double maxVoltage; + private double maxCurrent; private List lines; public LoadlineEntity() { @@ -55,27 +51,27 @@ public class LoadlineEntity implements Serializable { this.name = name; } - public Power getMaxDissipation() { + public double getMaxDissipation() { return maxDissipation; } - public void setMaxDissipation(Power maxDissipation) { + public void setMaxDissipation(double maxDissipation) { this.maxDissipation = maxDissipation; } - public Voltage getMaxVoltage() { + public double getMaxVoltage() { return maxVoltage; } - public void setMaxVoltage(Voltage maxVoltage) { + public void setMaxVoltage(double maxVoltage) { this.maxVoltage = maxVoltage; } - public Current getMaxCurrent() { + public double getMaxCurrent() { return maxCurrent; } - public void setMaxCurrent(Current maxCurrent) { + public void setMaxCurrent(double maxCurrent) { this.maxCurrent = maxCurrent; } @@ -89,14 +85,14 @@ public class LoadlineEntity implements Serializable { // Individual load line, tied to the grid voltage public static class Line { - private Voltage voltage; + private double voltage; private Point2D[] controlPoints; - public Voltage getVoltage() { + public double getVoltage() { return voltage; } - public void setVoltage(Voltage voltage) { + public void setVoltage(double voltage) { this.voltage = voltage; } diff --git a/diylc/diylc-swing/dict.txt b/diylc/diylc-swing/dict.txt index 16dfd2d2..6564b6fa 100644 --- a/diylc/diylc-swing/dict.txt +++ b/diylc/diylc-swing/dict.txt @@ -37,9 +37,6 @@ DP5T DPDT DPDT (Center OFF) E-B-C BJT -English -Español -Français G-D-S JFET G-D-S MOSFET G-S-D JFET @@ -61,7 +58,6 @@ SMD SPDT SPDT (Center OFF) SPST -Srpski Xnor Xor cm diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index 6f6dd1dc..e4eda30d 100644 Binary files a/diylc/diylc-swing/lib/diylc-core.jar and b/diylc/diylc-swing/lib/diylc-core.jar differ diff --git a/diylc/diylc-swing/library/main.jar b/diylc/diylc-swing/library/main.jar index fe14ec2b..1b7c65fa 100644 Binary files a/diylc/diylc-swing/library/main.jar and b/diylc/diylc-swing/library/main.jar differ diff --git a/diylc/diylc-swing/src/org/diylc/swing/gui/editor/ImageEditor.java b/diylc/diylc-swing/src/org/diylc/swing/gui/editor/ImageEditor.java index 40569b5f..c22892d2 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/gui/editor/ImageEditor.java +++ b/diylc/diylc-swing/src/org/diylc/swing/gui/editor/ImageEditor.java @@ -1,85 +1,76 @@ /* + * + * DIY Layout Creator (DIYLC). Copyright (c) 2009-2018 held jointly by the individual authors. + * + * This file is part of DIYLC. + * + * DIYLC 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 3 of the + * License, or (at your option) any later version. + * + * DIYLC 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 DIYLC. If not, see + * . + * + */ +package org.diylc.swing.gui.editor; - DIY Layout Creator (DIYLC). - Copyright (c) 2009-2018 held jointly by the individual authors. - - This file is part of DIYLC. - - DIYLC 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 3 of the License, or - (at your option) any later version. - - DIYLC 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 DIYLC. If not, see . - -*/ -package org.diylc.swing.gui.editor; - import java.awt.event.ActionListener; import java.io.File; import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; import javax.swing.JButton; +import org.apache.log4j.Logger; import org.apache.poi.util.IOUtils; import org.diylc.common.PropertyWrapper; import org.diylc.swing.gui.DialogFactory; import org.diylc.swing.plugins.file.FileFilterEnum; - -public class ImageEditor extends JButton { - - private static final long serialVersionUID = 1L; - - private static final String title = "Click to load image file"; - - public ImageEditor(final PropertyWrapper property) { + +public class ImageEditor extends JButton { + + private static final long serialVersionUID = 1L; + + private static final Logger LOG = Logger.getLogger(ImageEditor.class); + + private static final String title = "Click to load image file"; + + public ImageEditor(final PropertyWrapper property) { super(property.isUnique() ? title : ("(multi value) " + title)); if (property.isReadOnly()) - setEnabled(false); - addActionListener(new ActionListener() { - - @Override - public void actionPerformed(java.awt.event.ActionEvent e) { - File file = - DialogFactory.getInstance().showOpenDialog(FileFilterEnum.IMAGES.getFilter(), null, - FileFilterEnum.IMAGES.getExtensions()[0], null); - if (file != null) { + setEnabled(false); + addActionListener(new ActionListener() { + + @Override + public void actionPerformed(java.awt.event.ActionEvent e) { + File file = DialogFactory.getInstance().showOpenDialog(FileFilterEnum.IMAGES.getFilter(), + null, FileFilterEnum.IMAGES.getExtensions()[0], null); + if (file != null) { property.setChanged(true); FileInputStream fis; try { fis = new FileInputStream(file); - byte[] byteArray = IOUtils.toByteArray(fis); -// ImageIcon image = new ImageIcon(file.getAbsolutePath()); + byte[] byteArray = IOUtils.toByteArray(fis); property.setValue(byteArray); fis.close(); - } catch (FileNotFoundException e1) { - // TODO Auto-generated catch block - e1.printStackTrace(); - } catch (IOException e1) { - // TODO Auto-generated catch block - e1.printStackTrace(); + } catch (Exception e1) { + LOG.error("Error loading image", e1); } - - } - } - }); - } - - // @Override - // public void setBackground(Color bg) { - // if (bg.getRed() < 127 || bg.getBlue() < 127 || bg.getGreen() < 127) { - // setForeground(Color.white); - // } else { - // setForeground(Color.black); - // } - // super.setBackground(bg); - // } -} + } + } + }); + } + + // @Override + // public void setBackground(Color bg) { + // if (bg.getRed() < 127 || bg.getBlue() < 127 || bg.getGreen() < 127) { + // setForeground(Color.white); + // } else { + // setForeground(Color.black); + // } + // super.setBackground(bg); + // } +} diff --git a/diylc/diylc-swing/src/org/diylc/swing/gui/editor/LoadlineEditorDialog.java b/diylc/diylc-swing/src/org/diylc/swing/gui/editor/LoadlineEditorDialog.java index 1c11e5a2..e55cac15 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/gui/editor/LoadlineEditorDialog.java +++ b/diylc/diylc-swing/src/org/diylc/swing/gui/editor/LoadlineEditorDialog.java @@ -2,11 +2,20 @@ package org.diylc.swing.gui.editor; import java.awt.BorderLayout; import java.awt.Color; +import java.awt.Dimension; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.awt.geom.Point2D; import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.io.Reader; +import java.io.Writer; +import java.util.ArrayList; import java.util.EnumSet; import java.util.HashMap; import java.util.List; @@ -19,8 +28,9 @@ import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; -import javax.swing.JTextField; +import org.apache.log4j.Logger; +import org.apache.poi.util.IOUtils; import org.diylc.appframework.miscutils.IConfigurationManager; import org.diylc.appframework.miscutils.InMemoryConfigurationManager; import org.diylc.appframework.miscutils.Utils; @@ -31,29 +41,41 @@ import org.diylc.common.IPlugInPort; import org.diylc.common.PropertyWrapper; import org.diylc.common.VerticalAlignment; import org.diylc.components.AbstractCurvedComponent.PointCount; -import org.diylc.components.connectivity.CurvedTrace; import org.diylc.components.connectivity.Dot; import org.diylc.components.connectivity.Line; +import org.diylc.components.misc.Image; +import org.diylc.components.misc.Image.ImageSizingMode; import org.diylc.components.misc.Label; +import org.diylc.components.misc.LoadlineCurve; import org.diylc.components.misc.LoadlineEntity; +import org.diylc.core.IDIYComponent; import org.diylc.core.IView; import org.diylc.core.Project; -import org.diylc.core.measures.Current; -import org.diylc.core.measures.CurrentUnit; import org.diylc.core.measures.Size; import org.diylc.core.measures.SizeUnit; import org.diylc.core.measures.Voltage; import org.diylc.core.measures.VoltageUnit; import org.diylc.images.IconLoader; +import org.diylc.lang.LangUtil; import org.diylc.presenter.Presenter; +import org.diylc.swing.gui.DialogFactory; import org.diylc.swing.plugins.canvas.CanvasPanel; +import org.diylc.swing.plugins.file.FileFilterEnum; import org.diylc.swingframework.ButtonDialog; import org.diylc.swingframework.DoubleTextField; +import com.thoughtworks.xstream.XStream; +import com.thoughtworks.xstream.io.xml.DomDriver; + public class LoadlineEditorDialog extends ButtonDialog implements IView { private static final long serialVersionUID = 1L; + + private static final Logger LOG = Logger.getLogger(LoadlineEditorDialog.class); + private static final String AXIS_LABEL = "AXIS_LABEL"; + private static final String CURVE = "CURVE"; + private LoadlineEntity loadline; private JPanel panel; private JPanel toolbar; @@ -62,6 +84,10 @@ public class LoadlineEditorDialog extends ButtonDialog implements IView { private Presenter plugInPort; private IConfigurationManager configManager; + private DoubleTextField vEditor; + private DoubleTextField iEditor; + private DoubleTextField dEditor; + private static int[] INCREMENTS = new int[] {100, 50, 20, 10, 5, 1}; private int xIncrement; private int yIncrement; @@ -71,28 +97,32 @@ public class LoadlineEditorDialog extends ButtonDialog implements IView { if (loadline == null) { loadline = new LoadlineEntity(); - loadline.setMaxVoltage(new Voltage(300d, VoltageUnit.V)); - loadline.setMaxCurrent(new Current(5d, CurrentUnit.mA)); + loadline.setMaxVoltage(300); + loadline.setMaxCurrent(5); + loadline.setLines(new ArrayList()); } - + configManager = new InMemoryConfigurationManager(new HashMap() { private static final long serialVersionUID = 1L; { put(IPlugInPort.LOCKED_ALPHA, false); put(IPlugInPort.EXTRA_SPACE_KEY, false); + put(IPlugInPort.SHOW_GRID_KEY, false); } }); - + this.loadline = loadline; this.plugInPort = new Presenter(this, configManager); this.plugInPort.installPlugin(new IPlugIn() { + @SuppressWarnings("incomplete-switch") @Override public void processMessage(EventType type, Object... params) { switch (type) { case REPAINT: + applyToLoadline(); getCanvasPanel().repaint(); break; } @@ -106,12 +136,20 @@ public class LoadlineEditorDialog extends ButtonDialog implements IView { @Override public void connect(IPlugInPort plugInPort) {} }); - initializeProject(); - updateAxis(); + + loadProject(); layoutGui(); } + private void loadProject() { + getvEditor().setValue(loadline.getMaxVoltage()); + getiEditor().setValue(loadline.getMaxCurrent()); + getdEditor().setValue(loadline.getMaxDissipation()); + loadlineToProject(); + updateAxis(); + } + @Override protected JComponent getMainComponent() { if (panel == null) { @@ -127,6 +165,7 @@ public class LoadlineEditorDialog extends ButtonDialog implements IView { public JPanel getToolbar() { if (toolbar == null) { toolbar = new JPanel(); + toolbar.add(new JButton(new ClearAction())); toolbar.add(new JButton(new LoadAction())); toolbar.add(new JButton(new SaveAction())); toolbar.add(new JButton(new LoadImageAction())); @@ -141,6 +180,23 @@ public class LoadlineEditorDialog extends ButtonDialog implements IView { canvasPanel = new CanvasPanel(plugInPort, configManager); canvasPanel.setPreferredSize(plugInPort.getCanvasDimensions(true, false)); + canvasPanel.addMouseListener(new MouseAdapter() { + + @Override + public void mouseClicked(MouseEvent e) { + if (e.getButton() == MouseEvent.BUTTON2) + return; + plugInPort.mouseClicked(e.getPoint(), e.getButton(), + Utils.isMac() ? e.isMetaDown() : e.isControlDown(), e.isShiftDown(), e.isAltDown(), + e.getClickCount()); + } + + @Override + public void mousePressed(MouseEvent e) { + canvasPanel.requestFocus(); + } + }); + canvasPanel.addMouseMotionListener(new MouseAdapter() { @Override @@ -154,27 +210,42 @@ public class LoadlineEditorDialog extends ButtonDialog implements IView { return canvasPanel; } + public DoubleTextField getvEditor() { + if (vEditor == null) + vEditor = new DoubleTextField(); + return vEditor; + } + + public DoubleTextField getiEditor() { + if (iEditor == null) + iEditor = new DoubleTextField(); + return iEditor; + } + + public DoubleTextField getdEditor() { + if (dEditor == null) + dEditor = new DoubleTextField(); + return dEditor; + } + public JPanel getControlPanel() { if (controlPanel == null) { controlPanel = new JPanel(); controlPanel.add(new JLabel("Max Voltage (V): ")); - JTextField vEditor = new DoubleTextField(); vEditor.setColumns(8); - controlPanel.add(vEditor); + controlPanel.add(getvEditor()); controlPanel.add(new JLabel("Max Current (mA): ")); - JTextField iEditor = new DoubleTextField(); iEditor.setColumns(8); - controlPanel.add(iEditor); + controlPanel.add(getiEditor()); controlPanel.add(new JLabel("Max Dissipation (W): ")); - JTextField dEditor = new DoubleTextField(); dEditor.setColumns(8); - controlPanel.add(dEditor); + controlPanel.add(getdEditor()); - JButton updateButton = new JButton("Update"); + JButton updateButton = new JButton(new UpdateValuesAction()); controlPanel.add(updateButton); } @@ -182,7 +253,7 @@ public class LoadlineEditorDialog extends ButtonDialog implements IView { } - private void initializeProject() { + private void loadlineToProject() { Project project = new Project(); project.setWidth(new Size(5d, SizeUnit.in)); project.setHeight(new Size(3d, SizeUnit.in)); @@ -234,13 +305,45 @@ public class LoadlineEditorDialog extends ButtonDialog implements IView { dot.setControlPoint(new Point(centerX, centerY), 0); project.getComponents().add(dot); project.getLockedComponents().add(dot); + + double v = loadline.getMaxVoltage(); + double i = loadline.getMaxCurrent(); + int maxX = (int) (project.getWidth().convertToPixels() - spacing * 4); + int maxY = (int) (spacing * 5); + + for(LoadlineEntity.Line l : loadline.getLines()) { + LoadlineCurve t = new LoadlineCurve(); + t.setName(CURVE); + + if (l.getControlPoints().length == 2) + t.setPointCount(PointCount.TWO); + else if (l.getControlPoints().length == 3) + t.setPointCount(PointCount.THREE); + else if (l.getControlPoints().length == 4) + t.setPointCount(PointCount.FOUR); + else if (l.getControlPoints().length == 5) + t.setPointCount(PointCount.FIVE); + else if (l.getControlPoints().length == 7) + t.setPointCount(PointCount.SEVEN); + + for (int j = 0; j < l.getControlPoints().length; j++) { + Point2D p = l.getControlPoints()[j]; +// points[j] = new Point2D.Double(1.0f * (p.x - centerX) / (maxX - centerX) * v, +// 1.0f * (p.y - centerY) / (maxY - centerY) * i); + t.setControlPoint(new Point((int) (p.getX() / v * (maxX - centerX) + centerX), (int) (p.getY() / i * (maxY - centerY) + centerY)), j); + } + t.setThickness(new Size(2d, SizeUnit.px)); + t.setLeadColor(Color.blue); + t.setVoltage(new Voltage(l.getVoltage(), VoltageUnit.V)); + project.getComponents().add(t); + } plugInPort.loadProject(project, true, "n/a"); } private void updateAxis() { - int v = loadline.getMaxVoltage().getValue().intValue(); - int i = loadline.getMaxCurrent().getValue().intValue(); + int v = (int) loadline.getMaxVoltage(); + int i = (int) loadline.getMaxCurrent(); for (int j = 0; j < INCREMENTS.length; j++) { int increment = INCREMENTS[j]; @@ -281,6 +384,7 @@ public class LoadlineEditorDialog extends ButtonDialog implements IView { project.getLockedComponents().add(tick); Label xLabel = new Label(); + xLabel.setName(AXIS_LABEL); xLabel.setValue(String.valueOf(j)); xLabel.setControlPoint(new Point((int) (centerX + offset), (int) (centerY + spacing / 2 + 1)), 0); @@ -302,6 +406,7 @@ public class LoadlineEditorDialog extends ButtonDialog implements IView { project.getLockedComponents().add(tick); Label yLabel = new Label(); + yLabel.setName(AXIS_LABEL); yLabel.setValue(String.valueOf(j)); yLabel.setControlPoint(new Point((int) (centerX - spacing / 2 - 1), (int) (centerY + offset)), 0); @@ -320,7 +425,8 @@ public class LoadlineEditorDialog extends ButtonDialog implements IView { int centerX = (int) (spacing * 3); int centerY = (int) (project.getHeight().convertToPixels() - spacing * 3); - CurvedTrace t = new CurvedTrace(); + LoadlineCurve t = new LoadlineCurve(); + t.setName(CURVE); t.setPointCount(PointCount.FOUR); t.setControlPoint(new Point(centerX, centerY), 0); t.setControlPoint(new Point((int) (centerX + 30 * spacing), (int) (centerY - 10 * spacing)), 1); @@ -333,6 +439,38 @@ public class LoadlineEditorDialog extends ButtonDialog implements IView { plugInPort.loadProject(plugInPort.getCurrentProject(), false, "n/a"); } + private void applyToLoadline() { + Project project = plugInPort.getCurrentProject(); + double spacing = project.getGridSpacing().convertToPixels(); + + int centerX = (int) (spacing * 3); + int centerY = (int) (project.getHeight().convertToPixels() - spacing * 3); + double v = loadline.getMaxVoltage(); + double i = loadline.getMaxCurrent(); + int maxX = (int) (project.getWidth().convertToPixels() - spacing * 4); + int maxY = (int) (spacing * 5); + + List lines = + new ArrayList(); + for (IDIYComponent c : project.getComponents()) { + if (CURVE.equals(c.getName())) { + Point2D[] points = new Point2D[c.getControlPointCount()]; + for (int j = 0; j < c.getControlPointCount(); j++) { + Point p = c.getControlPoint(j); + points[j] = new Point2D.Double(1.0f * (p.x - centerX) / (maxX - centerX) * v, + 1.0f * (p.y - centerY) / (maxY - centerY) * i); + } + LoadlineCurve curve = (LoadlineCurve)c; + org.diylc.components.misc.LoadlineEntity.Line line = + new org.diylc.components.misc.LoadlineEntity.Line(); + line.setControlPoints(points); + line.setVoltage(curve.getVoltage() == null ? 0 : curve.getVoltage().getValue()); + lines.add(line); + } + } + loadline.setLines(lines); + } + @Override public void showMessage(String message, String title, int messageType) { // TODO Auto-generated method stub @@ -348,8 +486,11 @@ public class LoadlineEditorDialog extends ButtonDialog implements IView { @Override public boolean editProperties(List properties, Set defaultedProperties) { - // TODO Auto-generated method stub - return false; + PropertyEditorDialog editor = DialogFactory.getInstance().createPropertyEditorDialog(properties, + LangUtil.translate("Edit Selection"), true); + editor.setVisible(true); + defaultedProperties.addAll(editor.getDefaultedProperties()); + return ButtonDialog.OK.equals(editor.getSelectedButtonCaption()); } @Override @@ -375,7 +516,51 @@ public class LoadlineEditorDialog extends ButtonDialog implements IView { } @Override - public void actionPerformed(ActionEvent e) {} + public void actionPerformed(ActionEvent e) { + applyToLoadline(); + + final File file = DialogFactory.getInstance().showSaveDialog(LoadlineEditorDialog.this, + FileFilterEnum.CRV.getFilter(), null, FileFilterEnum.CRV.getExtensions()[0], null); + if (file != null) { + try { + XStream xStream = new XStream(new DomDriver("UTF-8")); + xStream.autodetectAnnotations(true); + xStream.alias("point", Point2D.Double.class); + xStream.alias("curve", org.diylc.components.misc.LoadlineEntity.Line.class); + xStream.alias("loadline", org.diylc.components.misc.LoadlineEntity.class); + + FileOutputStream fos; + fos = new FileOutputStream(file); + Writer writer = new OutputStreamWriter(fos, "UTF-8"); + writer.write("\n"); + xStream.toXML(loadline, writer); + fos.close(); + } catch (Exception ex) { + LOG.error("Error saving loadline file", ex); + } + } + } + } + + class ClearAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + + public ClearAction() { + super(); + putValue(Action.NAME, "Clear"); + putValue(Action.SMALL_ICON, IconLoader.Delete.getIcon()); + } + + @Override + public void actionPerformed(ActionEvent e) { + loadline = new LoadlineEntity(); + loadline.setMaxVoltage(300); + loadline.setMaxCurrent(5); + loadline.setLines(new ArrayList()); + + loadProject(); + } } class LoadAction extends AbstractAction { @@ -389,7 +574,46 @@ public class LoadlineEditorDialog extends ButtonDialog implements IView { } @Override - public void actionPerformed(ActionEvent e) {} + public void actionPerformed(ActionEvent e) { + final File file = DialogFactory.getInstance().showOpenDialog(FileFilterEnum.CRV.getFilter(), null, + FileFilterEnum.CRV.getExtensions()[0], null); + if (file != null) { + try { + XStream xStream = new XStream(new DomDriver("UTF-8")); + xStream.autodetectAnnotations(true); + xStream.alias("point", Point2D.Double.class); + xStream.alias("curve", org.diylc.components.misc.LoadlineEntity.Line.class); + xStream.alias("loadline", org.diylc.components.misc.LoadlineEntity.class); + + FileInputStream fis = new FileInputStream(file); + Reader reader = new InputStreamReader(fis, "UTF-8"); + loadline = (LoadlineEntity) xStream.fromXML(reader); + fis.close(); + loadProject(); + } catch (Exception ex) { + LOG.error("Error loading loadline file", ex); + } + } + } + } + + class UpdateValuesAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + + public UpdateValuesAction() { + super(); + putValue(Action.NAME, "Update Axis"); + } + + @Override + public void actionPerformed(ActionEvent e) { + loadline.setMaxVoltage(getvEditor().getValue()); + loadline.setMaxCurrent(getiEditor().getValue()); + loadline.setMaxDissipation(getdEditor().getValue()); + updateAxis(); + applyToLoadline(); + } } class AddCurveAction extends AbstractAction { @@ -419,6 +643,35 @@ public class LoadlineEditorDialog extends ButtonDialog implements IView { } @Override - public void actionPerformed(ActionEvent e) {} + public void actionPerformed(ActionEvent e) { + File file = DialogFactory.getInstance().showOpenDialog(FileFilterEnum.IMAGES.getFilter(), + null, FileFilterEnum.IMAGES.getExtensions()[0], null); + if (file != null) { + FileInputStream fis; + try { + fis = new FileInputStream(file); + byte[] byteArray = IOUtils.toByteArray(fis); + Image image = new Image(); + image.setData(byteArray); + image.setSizingMode(ImageSizingMode.TwoPoints); + Dimension canvasDimensions = plugInPort.getCanvasDimensions(true, false); + Project project = plugInPort.getCurrentProject(); + + double spacing = project.getGridSpacing().convertToPixels(); + // stretch the image across the canvas + image.setControlPoint(new Point((int) spacing, (int) spacing), 0); + image.setControlPoint(new Point((int) (canvasDimensions.width - spacing), + (int) (canvasDimensions.height - spacing)), 1); + image.setAlpha((byte) 50); // make it transparent + fis.close(); + // add to the bottom + project.getComponents().add(0, image); + // reload the project + plugInPort.loadProject(plugInPort.getCurrentProject(), false, "n/a"); + } catch (Exception e1) { + LOG.error("Error loading image", e1); + } + } + } } } diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/file/FileFilterEnum.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/file/FileFilterEnum.java index 491c5c3b..0bd381a3 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/file/FileFilterEnum.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/file/FileFilterEnum.java @@ -29,42 +29,43 @@ public enum FileFilterEnum { PNG("PNG Images (*.png)", "png"), PDF("PDF Files (*.pdf)", "pdf"), DIY("DIY Project Files (*.diy)", "diy"), EXCEL( "Excel Workbooks (*.xls)", "xls"), CSV("Comma Separated Files (*.csv)", "csv"), HTML("HTML Files (*.html)", - "html"), IMAGES("Image Files (*.png, *.jpg, *.gif)", "png", "jpg", "gif"), XML("XML Files (*.xml)", "xml"), TEST("Test Files (*.tst)", "tst"); - - FileFilter filter; - String[] extensions; - - private FileFilterEnum(final String description, final String... extensions) { - this.extensions = extensions; - filter = new FileFilter() { - - @Override - public boolean accept(File f) { - if (f.isDirectory()) { - return true; - } - String fileExt = f.getName(); - fileExt = fileExt.substring(fileExt.lastIndexOf('.') + 1).toLowerCase(); - for (String ext : extensions) { - if (ext.equals(fileExt)) { - return true; - } - } - return false; - } - - @Override - public String getDescription() { - return description; - } - }; - } - - public FileFilter getFilter() { - return filter; - } - - public String[] getExtensions() { - return extensions; - } -} + "html"), IMAGES("Image Files (*.png, *.jpg, *.gif)", "png", "jpg", "gif"), XML("XML Files (*.xml)", "xml"), + TEST("Test Files (*.tst)", "tst"), CRV("Curve Files (*.crv)", "crv"); + + FileFilter filter; + String[] extensions; + + private FileFilterEnum(final String description, final String... extensions) { + this.extensions = extensions; + filter = new FileFilter() { + + @Override + public boolean accept(File f) { + if (f.isDirectory()) { + return true; + } + String fileExt = f.getName(); + fileExt = fileExt.substring(fileExt.lastIndexOf('.') + 1).toLowerCase(); + for (String ext : extensions) { + if (ext.equals(fileExt)) { + return true; + } + } + return false; + } + + @Override + public String getDescription() { + return description; + } + }; + } + + public FileFilter getFilter() { + return filter; + } + + public String[] getExtensions() { + return extensions; + } +}