diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml b/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml
index fa04be73..3ad9e310 100644
--- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml
+++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml
@@ -5,6 +5,6 @@
metric
- true
+ false
\ No newline at end of file
diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/library/main.jar b/ diy-layout-creator --username bancika@gmail.com/DIYLC/library/main.jar
index 8b45c49e..21f6aeb8 100644
Binary files a/ diy-layout-creator --username bancika@gmail.com/DIYLC/library/main.jar and b/ diy-layout-creator --username bancika@gmail.com/DIYLC/library/main.jar differ
diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/EventType.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/EventType.java
index 63be45bc..7c1b939b 100644
--- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/EventType.java
+++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/EventType.java
@@ -1,10 +1,10 @@
package org.diylc.common;
import java.awt.Rectangle;
+import java.awt.geom.Point2D;
import org.diylc.core.Project;
-
/**
* Enumerates all possible events between {@link IPlugInPort} and
* {@link IPlugIn}. Some events overlap so be careful which ones you subscribe
@@ -37,6 +37,12 @@ public enum EventType {
* {@link ComponentSelection} is attached as a parameter.
*/
SELECTION_CHANGED,
+ /**
+ * Called when selection size changes, together with a {@link Point2D}
+ * object containing selection size (x = width, y = height). Size is
+ * expressed in the default measure (cm for metric, inches for imperial).
+ */
+ SELECTION_SIZE_CHANGED,
/**
* Called when display needs to be repainted. No parameters are passed.
*/
@@ -51,5 +57,12 @@ public enum EventType {
* {@link Project} are passed as parameters, one before and one after the
* change. The third parameter is a string containing change description.
*/
- PROJECT_MODIFIED, AVAILABLE_CTRL_POINTS_CHANGED, SELECTED_CTRL_POINTS_CHANGED, ;
+ PROJECT_MODIFIED,
+ /**
+ * Called when control points under the cursor are changed. A single
+ * parameter is passed, an instance of
+ * Map, Set> containing all the
+ * components and indices of their control points that are under the cursor.
+ */
+ AVAILABLE_CTRL_POINTS_CHANGED, SELECTED_CTRL_POINTS_CHANGED, ;
}
diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/IPlugInPort.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/IPlugInPort.java
index 2ef36a2a..cfc0ee89 100644
--- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/IPlugInPort.java
+++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/IPlugInPort.java
@@ -288,4 +288,11 @@ public interface IPlugInPort {
* instantiate new component.
*/
void setNewComponentSlot(ComponentType componentType);
+
+ /**
+ * Changes default size notation, true for metric, false for imperial.
+ *
+ * @param isMetric
+ */
+ void setMetric(boolean isMetric);
}
diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Size.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Size.java
index 4dd220de..eae9919d 100644
--- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Size.java
+++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Size.java
@@ -1,13 +1,11 @@
package org.diylc.core.measures;
-import java.awt.Toolkit;
+import org.diylc.utils.Constants;
public class Size extends AbstractMeasure {
private static final long serialVersionUID = 1L;
- public static final int PIXELS_PER_INCH = Toolkit.getDefaultToolkit().getScreenResolution();
-
public Size() {
super();
// TODO Auto-generated constructor stub
@@ -20,7 +18,7 @@ public class Size extends AbstractMeasure {
public int convertToPixels() {
double factor = getUnit().getFactor() / SizeUnit.in.getFactor();
- return (int) (factor * PIXELS_PER_INCH * getValue());
+ return (int) (factor * Constants.PIXELS_PER_INCH * getValue());
}
@Override
diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/canvas/CanvasPlugin.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/canvas/CanvasPlugin.java
index 1728eb94..83d7beef 100644
--- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/canvas/CanvasPlugin.java
+++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/canvas/CanvasPlugin.java
@@ -13,6 +13,7 @@ import org.diylc.common.EventType;
import org.diylc.common.IPlugIn;
import org.diylc.common.IPlugInPort;
import org.diylc.plugins.file.ProjectDrawingProvider;
+import org.diylc.presenter.Presenter;
import com.diyfever.gui.miscutils.ConfigurationManager;
import com.diyfever.gui.ruler.IRulerListener;
@@ -22,7 +23,7 @@ public class CanvasPlugin implements IPlugIn {
private static final Logger LOG = Logger.getLogger(CanvasPlugin.class);
- private static final String METRIC_KEY = "metric";
+
private RulerScrollPane scrollPane;
private CanvasPanel canvasPanel;
@@ -46,7 +47,7 @@ public class CanvasPlugin implements IPlugIn {
if (scrollPane == null) {
scrollPane = new RulerScrollPane(canvasPanel, new ProjectDrawingProvider(plugInPort));
Boolean metric = (Boolean) ConfigurationManager.getInstance().getConfigurationItem(
- METRIC_KEY);
+ Presenter.METRIC_KEY);
if (metric == null) {
metric = true;
}
@@ -55,7 +56,7 @@ public class CanvasPlugin implements IPlugIn {
@Override
public void unitsChanged(boolean isMetric) {
- ConfigurationManager.getInstance().setConfigurationItem(METRIC_KEY, isMetric);
+ plugInPort.setMetric(isMetric);
}
});
}
diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/statusbar/StatusBar.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/statusbar/StatusBar.java
index 2bc3c1d2..6ff72c61 100644
--- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/statusbar/StatusBar.java
+++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/statusbar/StatusBar.java
@@ -5,6 +5,9 @@ import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
+import java.awt.geom.Point2D;
+import java.text.DecimalFormat;
+import java.text.Format;
import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumSet;
@@ -15,7 +18,10 @@ import javax.swing.BorderFactory;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
+import javax.swing.JSeparator;
+import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
import org.diylc.common.BadPositionException;
import org.diylc.common.ComponentType;
@@ -24,8 +30,10 @@ import org.diylc.common.IPlugIn;
import org.diylc.common.IPlugInPort;
import org.diylc.core.IDIYComponent;
import org.diylc.presenter.ComparatorFactory;
+import org.diylc.presenter.Presenter;
import com.diyfever.gui.MemoryBar;
+import com.diyfever.gui.miscutils.ConfigurationManager;
import com.diyfever.gui.miscutils.PercentageListCellRenderer;
import com.diyfever.gui.update.UpdateLabel;
@@ -34,11 +42,13 @@ public class StatusBar extends JPanel implements IPlugIn {
private static final long serialVersionUID = 1L;
public static String UPDATE_URL = "http://www.diy-fever.com/update.xml";
+ private static final Format sizeFormat = new DecimalFormat("0.00");
private JComboBox zoomBox;
private UpdateLabel updateLabel;
private MemoryBar memoryPanel;
private JLabel statusLabel;
+ private JLabel sizeLabel;
private IPlugInPort plugInPort;
@@ -97,6 +107,16 @@ public class StatusBar extends JPanel implements IPlugIn {
return statusLabel;
}
+ public JLabel getSizeLabel() {
+ if (sizeLabel == null) {
+ sizeLabel = new JLabel();
+ sizeLabel.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createMatteBorder(
+ 0, 1, 0, 1, UIManager.getColor("Separator.shadow")), BorderFactory
+ .createEmptyBorder(0, 4, 0, 4)));
+ }
+ return sizeLabel;
+ }
+
private void layoutComponents() {
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
@@ -116,16 +136,25 @@ public class StatusBar extends JPanel implements IPlugIn {
gbc.gridx = 1;
gbc.fill = GridBagConstraints.BOTH;
gbc.weightx = 0;
- add(zoomPanel, gbc);
+ add(new JSeparator(SwingConstants.HORIZONTAL), gbc);
gbc.gridx = 2;
- add(getUpdateLabel(), gbc);
+ add(getSizeLabel(), gbc);
gbc.gridx = 3;
+ add(new JSeparator(SwingConstants.HORIZONTAL), gbc);
+
+ gbc.gridx = 4;
+ add(zoomPanel, gbc);
+
+ gbc.gridx = 5;
+ add(getUpdateLabel(), gbc);
+
+ gbc.gridx = 6;
gbc.fill = GridBagConstraints.NONE;
add(getMemoryPanel(), gbc);
- gbc.gridx = 4;
+ gbc.gridx = 7;
add(new JPanel(), gbc);
}
@@ -148,7 +177,7 @@ public class StatusBar extends JPanel implements IPlugIn {
@Override
public EnumSet getSubscribedEventTypes() {
return EnumSet.of(EventType.ZOOM_CHANGED, EventType.SLOT_CHANGED,
- EventType.AVAILABLE_CTRL_POINTS_CHANGED);
+ EventType.AVAILABLE_CTRL_POINTS_CHANGED, EventType.SELECTION_SIZE_CHANGED);
}
@SuppressWarnings("unchecked")
@@ -160,6 +189,18 @@ public class StatusBar extends JPanel implements IPlugIn {
getZoomBox().setSelectedItem(params[0]);
}
break;
+ case SELECTION_SIZE_CHANGED:
+ Point2D size = (Point2D) params[0];
+ boolean isMetric = (Boolean) ConfigurationManager.getInstance().getConfigurationItem(
+ Presenter.METRIC_KEY);
+ if (size == null) {
+ getSizeLabel().setText("Size: N/A");
+ } else {
+ getSizeLabel().setText(
+ "Size: " + sizeFormat.format(size.getX()) + " x "
+ + sizeFormat.format(size.getY()) + (isMetric ? " cm" : " in"));
+ }
+ break;
case SLOT_CHANGED:
componentSlot = (ComponentType) params[0];
refreshStatusText();
diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/G2DWrapper.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/G2DWrapper.java
index e3709b84..790e81b3 100644
--- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/G2DWrapper.java
+++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/G2DWrapper.java
@@ -416,6 +416,12 @@ class G2DWrapper extends Graphics2D {
canvasGraphics.fillPolygon(points, points2, points3);
appendShape(new Polygon(points, points2, points3));
}
+
+ @Override
+ public void drawRect(int x, int y, int width, int height) {
+ canvasGraphics.drawRect(x, y, width, height);
+ appendShape(new Rectangle(x, y, width, height));
+ }
@Override
public void fillRect(int x, int y, int width, int height) {
diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/Presenter.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/Presenter.java
index 7fc23183..c93b0500 100644
--- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/Presenter.java
+++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/Presenter.java
@@ -42,6 +42,7 @@ import org.diylc.core.ComponentState;
import org.diylc.core.IDIYComponent;
import org.diylc.core.Project;
import org.diylc.core.annotations.ComponentDescriptor;
+import org.diylc.core.measures.SizeUnit;
import org.diylc.gui.IView;
import org.diylc.utils.Constants;
@@ -63,6 +64,8 @@ public class Presenter implements IPlugInPort {
public static final VersionNumber CURRENT_VERSION = new VersionNumber(0, 0, 0);
public static final String DEFAULTS_KEY = "defaults";
+ public static final String METRIC_KEY = "metric";
+
public static final int CONTROL_POINT_SENSITIVITY = 4;
public static final int ICON_SIZE = 32;
public static boolean ENABLE_ANTIALIASING = true;
@@ -443,6 +446,8 @@ public class Presenter implements IPlugInPort {
}
}
messageDispatcher.dispatchMessage(EventType.SELECTION_CHANGED, selectedComponents);
+ messageDispatcher.dispatchMessage(EventType.SELECTION_SIZE_CHANGED,
+ calculateSelectionDimension());
messageDispatcher.dispatchMessage(EventType.REPAINT);
}
}
@@ -520,11 +525,15 @@ public class Presenter implements IPlugInPort {
selectedComponents.clear();
selectedComponents.addAll(controlPointMap.keySet());
messageDispatcher.dispatchMessage(EventType.SELECTION_CHANGED, selectedComponents);
+ messageDispatcher.dispatchMessage(EventType.SELECTION_SIZE_CHANGED,
+ calculateSelectionDimension());
messageDispatcher.dispatchMessage(EventType.REPAINT);
} else if (components.isEmpty()) {
// If there are no components are under the cursor, reset selection.
selectedComponents.clear();
messageDispatcher.dispatchMessage(EventType.SELECTION_CHANGED, selectedComponents);
+ messageDispatcher.dispatchMessage(EventType.SELECTION_SIZE_CHANGED,
+ calculateSelectionDimension());
messageDispatcher.dispatchMessage(EventType.REPAINT);
} else {
// Take the last component, i.e. the top order component.
@@ -535,6 +544,8 @@ public class Presenter implements IPlugInPort {
selectedComponents.clear();
selectedComponents.add(component);
messageDispatcher.dispatchMessage(EventType.SELECTION_CHANGED, selectedComponents);
+ messageDispatcher.dispatchMessage(EventType.SELECTION_SIZE_CHANGED,
+ calculateSelectionDimension());
messageDispatcher.dispatchMessage(EventType.REPAINT);
}
// If there aren't any control points, try to add all the selected
@@ -594,6 +605,8 @@ public class Presenter implements IPlugInPort {
if (repaint) {
messageDispatcher.dispatchMessage(EventType.REPAINT);
}
+ messageDispatcher.dispatchMessage(EventType.SELECTION_SIZE_CHANGED,
+ calculateSelectionDimension());
return true;
}
@@ -619,6 +632,8 @@ public class Presenter implements IPlugInPort {
}
selectionRect = null;
messageDispatcher.dispatchMessage(EventType.SELECTION_CHANGED, selectedComponents);
+ messageDispatcher.dispatchMessage(EventType.SELECTION_SIZE_CHANGED,
+ calculateSelectionDimension());
}
// There is selection, so we need to finalize the drag&drop
// operation.
@@ -686,6 +701,41 @@ public class Presenter implements IPlugInPort {
}
}
+ @Override
+ public void setMetric(boolean isMetric) {
+ ConfigurationManager.getInstance().setConfigurationItem(Presenter.METRIC_KEY, isMetric);
+ messageDispatcher.dispatchMessage(EventType.SELECTION_SIZE_CHANGED,
+ calculateSelectionDimension());
+ }
+
+ private Point2D calculateSelectionDimension() {
+ if (selectedComponents.isEmpty()) {
+ return null;
+ }
+ boolean isMetric = (Boolean) ConfigurationManager.getInstance().getConfigurationItem(
+ METRIC_KEY);
+ Area area = new Area();
+ for (IDIYComponent> component : selectedComponents) {
+ Area componentArea = componentAreaMap.get(component);
+ if (componentArea != null) {
+ LOG.warn("Area added!" + componentArea.getBounds());
+ area.add(componentArea);
+ } else {
+ LOG.warn("No area!");
+ }
+ }
+ double width = area.getBounds2D().getWidth();
+ double height = area.getBounds2D().getHeight();
+ width /= Constants.PIXELS_PER_INCH;
+ height /= Constants.PIXELS_PER_INCH;
+ if (isMetric) {
+ width *= SizeUnit.in.getFactor() / SizeUnit.cm.getFactor();
+ height *= SizeUnit.in.getFactor() / SizeUnit.cm.getFactor();
+ }
+ Point2D dimension = new Point2D.Double(width, height);
+ return dimension;
+ }
+
/**
* Adds a component to the project taking z-order into account.
*
@@ -806,7 +856,9 @@ public class Presenter implements IPlugInPort {
: componentType.getName()));
this.componentSlot = componentType;
selectedComponents.clear();
- messageDispatcher.dispatchMessage(EventType.SELECTION_CHANGED);
+ messageDispatcher.dispatchMessage(EventType.SELECTION_CHANGED, selectedComponents);
+ messageDispatcher.dispatchMessage(EventType.SELECTION_SIZE_CHANGED,
+ calculateSelectionDimension());
messageDispatcher.dispatchMessage(EventType.SLOT_CHANGED, componentSlot);
}
diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/utils/Constants.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/utils/Constants.java
index b7099844..61ad4427 100644
--- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/utils/Constants.java
+++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/utils/Constants.java
@@ -6,9 +6,14 @@ import java.awt.Font;
import java.awt.Stroke;
import java.awt.Toolkit;
+import org.diylc.core.measures.Size;
+import org.diylc.core.measures.SizeUnit;
+
public class Constants {
- public static final int GRID = (int) (Toolkit.getDefaultToolkit().getScreenResolution() / 10f);
+ public static final int PIXELS_PER_INCH = Toolkit.getDefaultToolkit().getScreenResolution();
+ public static Size GRID_SIZE = new Size(0.1d, SizeUnit.in);
+ public static final int GRID = GRID_SIZE.convertToPixels();
public static Color CANVAS_COLOR = Color.white;
public static Color GRID_COLOR = new Color(240, 240, 240);