building blocks

This commit is contained in:
bancika
2017-01-12 15:50:54 +01:00
parent c64c9fb5b2
commit 0555d4b86e
18 changed files with 290 additions and 63 deletions
@@ -0,0 +1,38 @@
package org.diylc.common;
import java.util.Collection;
import org.diylc.core.IDIYComponent;
public class BuildingBlock {
private String name;
private Collection<IDIYComponent<?>> components;
public BuildingBlock(String name, Collection<IDIYComponent<?>> components) {
super();
this.name = name;
this.components = components;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Collection<IDIYComponent<?>> getComponents() {
return components;
}
public void setComponents(Collection<IDIYComponent<?>> components) {
this.components = components;
}
@Override
public String toString() {
return name;
}
}
@@ -0,0 +1,24 @@
package org.diylc.common;
public interface IBlockProcessor {
public static final String BLOCKS_KEY = "buildingBlocks";
void saveSelectionAsBlock(String blockName);
void loadBlock(String blockName) throws InvalidBlockException;
void deleteBlock(String blockName);
public class BlockAlreadyExistsException extends Exception {
private static final long serialVersionUID = 1L;
}
public class InvalidBlockException extends Exception {
private static final long serialVersionUID = 1L;
}
}
@@ -5,6 +5,7 @@ import java.awt.Dimension;
import java.awt.Graphics2D; import java.awt.Graphics2D;
import java.awt.Point; import java.awt.Point;
import java.awt.geom.Point2D; import java.awt.geom.Point2D;
import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
@@ -29,7 +30,7 @@ import org.diylc.core.Theme;
* @see IMessageListener * @see IMessageListener
* @see EventType * @see EventType
*/ */
public interface IPlugInPort extends ISelectionProcessor, IMouseProcessor, IKeyProcessor, ITemplateProcessor { public interface IPlugInPort extends ISelectionProcessor, IMouseProcessor, IKeyProcessor, ITemplateProcessor, IBlockProcessor {
public static final String ANTI_ALIASING_KEY = "antiAliasing"; public static final String ANTI_ALIASING_KEY = "antiAliasing";
public static final String HI_QUALITY_RENDER_KEY = "hiQualityRender"; public static final String HI_QUALITY_RENDER_KEY = "hiQualityRender";
@@ -178,7 +179,7 @@ public interface IPlugInPort extends ISelectionProcessor, IMouseProcessor, IKeyP
* *
* @param components * @param components
*/ */
void pasteComponents(List<IDIYComponent<?>> components); void pasteComponents(Collection<IDIYComponent<?>> components);
/** /**
* Deletes all the selected components from the project. * Deletes all the selected components from the project.
@@ -4,6 +4,7 @@ import java.awt.Point;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -110,7 +111,7 @@ public class InstantiationManager {
return changeMade; return changeMade;
} }
public void pasteComponents(List<IDIYComponent<?>> components, Point scaledPoint, boolean snapToGrid, Size gridSpacing) { public void pasteComponents(Collection<IDIYComponent<?>> components, Point scaledPoint, boolean snapToGrid, Size gridSpacing) {
// Adjust location of components so they are centered under the mouse // Adjust location of components so they are centered under the mouse
// cursor // cursor
int minX = Integer.MAX_VALUE; int minX = Integer.MAX_VALUE;
@@ -1296,7 +1296,7 @@ public class Presenter implements IPlugInPort {
} }
@Override @Override
public void pasteComponents(List<IDIYComponent<?>> components) { public void pasteComponents(Collection<IDIYComponent<?>> components) {
LOG.info(String.format("pasteComponents(%s)", components)); LOG.info(String.format("pasteComponents(%s)", components));
instantiationManager.pasteComponents(components, this.previousScaledPoint, isSnapToGrid(), instantiationManager.pasteComponents(components, this.previousScaledPoint, isSnapToGrid(),
currentProject.getGridSpacing()); currentProject.getGridSpacing());
@@ -2050,4 +2050,47 @@ public class Presenter implements IPlugInPort {
return point == null ? null : new Point((int) (point.x / drawingManager.getZoomLevel()), return point == null ? null : new Point((int) (point.x / drawingManager.getZoomLevel()),
(int) (point.y / drawingManager.getZoomLevel())); (int) (point.y / drawingManager.getZoomLevel()));
} }
@SuppressWarnings("unchecked")
@Override
public void saveSelectionAsBlock(String blockName) {
Map<String, Collection<IDIYComponent<?>>> blocks =
(Map<String, Collection<IDIYComponent<?>>>) ConfigurationManager.getInstance().readObject(BLOCKS_KEY, null);
if (blocks == null)
blocks = new HashMap<String, Collection<IDIYComponent<?>>>();
blocks.put(blockName, this.selectedComponents);
ConfigurationManager.getInstance().writeValue(BLOCKS_KEY, blocks);
}
@SuppressWarnings("unchecked")
@Override
public void loadBlock(String blockName) throws InvalidBlockException {
Map<String, Collection<IDIYComponent<?>>> blocks =
(Map<String, Collection<IDIYComponent<?>>>) ConfigurationManager.getInstance().readObject(BLOCKS_KEY, null);
if (blocks != null) {
Collection<IDIYComponent<?>> components = blocks.get(blockName);
if (components == null)
throw new InvalidBlockException();
List<IDIYComponent<?>> clones = new ArrayList<IDIYComponent<?>>();
for (IDIYComponent<?> c : components)
try {
clones.add(c.clone());
} catch (CloneNotSupportedException e) {
LOG.error("Could not clone component: " + c);
}
pasteComponents(clones);
} else
throw new InvalidBlockException();
}
@SuppressWarnings("unchecked")
@Override
public void deleteBlock(String blockName) {
Map<String, Collection<IDIYComponent<?>>> blocks =
(Map<String, Collection<IDIYComponent<?>>>) ConfigurationManager.getInstance().readObject(BLOCKS_KEY, null);
if (blocks != null) {
blocks.remove(blockName);
ConfigurationManager.getInstance().writeValue(BLOCKS_KEY, blocks);
}
}
} }
Binary file not shown.
@@ -35,7 +35,6 @@ public class TubeSocket extends AbstractTransparentComponent<String> {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private static Color BODY_COLOR = Color.decode("#F7F7EF"); private static Color BODY_COLOR = Color.decode("#F7F7EF");
// private static Color BORDER_COLOR = Color.decode("#8E8E38");
public static Color PIN_COLOR = Color.decode("#00B2EE"); public static Color PIN_COLOR = Color.decode("#00B2EE");
public static Color PIN_BORDER_COLOR = PIN_COLOR.darker(); public static Color PIN_BORDER_COLOR = PIN_COLOR.darker();
public static Size PIN_SIZE = new Size(1d, SizeUnit.mm); public static Size PIN_SIZE = new Size(1d, SizeUnit.mm);
@@ -44,6 +43,7 @@ public class TubeSocket extends AbstractTransparentComponent<String> {
private Base base = Base.B9A; private Base base = Base.B9A;
private String type = ""; private String type = "";
@Deprecated
private Orientation orientation; private Orientation orientation;
// private Mount mount = Mount.CHASSIS; // private Mount mount = Mount.CHASSIS;
private int angle; private int angle;
@@ -69,18 +69,6 @@ public class TubeSocket extends AbstractTransparentComponent<String> {
// Reset body shape // Reset body shape
body = null; body = null;
} }
//
// @EditableProperty
// public Orientation getOrientation() {
// return orientation;
// }
//
// public void setOrientation(Orientation orientation) {
// this.orientation = orientation;
// updateControlPoints();
// // Reset body shape
// body = null;
// }
@EditableProperty @EditableProperty
@SuppressWarnings("incomplete-switch") @SuppressWarnings("incomplete-switch")
Binary file not shown.
@@ -38,7 +38,8 @@ public enum IconLoader {
"cloud_wait.png"), Spinning("spinning.gif"), Megaphone("megaphone.png"), Download("download.png"), Eye("eye.png"), Messages( "cloud_wait.png"), Spinning("spinning.gif"), Megaphone("megaphone.png"), Download("download.png"), Eye("eye.png"), Messages(
"messages.png"), SearchBox("search-box.png"), Screwdriver("screwdriver.png"), Hammer("hammer.png"), FlipHorizontal( "messages.png"), SearchBox("search-box.png"), Screwdriver("screwdriver.png"), Hammer("hammer.png"), FlipHorizontal(
"flip_horizontal.png"), FlipVertical("flip_vertical.png"), MagicWand("magic_wand.png"), PinGrey("pin_grey.png"), PinGreen( "flip_horizontal.png"), FlipVertical("flip_vertical.png"), MagicWand("magic_wand.png"), PinGrey("pin_grey.png"), PinGreen(
"pin_green.png"); "pin_green.png"), CoffeebeanEdit("coffeebean_edit.png"), ApplicationEdit("application_edit.png"), ComponentAdd(
"component_add.png");
protected String name; protected String name;
Binary file not shown.

After

Width:  |  Height:  |  Size: 929 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 910 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 910 B

@@ -137,6 +137,10 @@ public class ActionFactory {
return new SaveAsTemplateAction(plugInPort); return new SaveAsTemplateAction(plugInPort);
} }
public SaveAsBlockAction createSaveAsBlockAction(IPlugInPort plugInPort) {
return new SaveAsBlockAction(plugInPort);
}
public ExpandSelectionAction createExpandSelectionAction(IPlugInPort plugInPort, ExpansionMode expansionMode) { public ExpandSelectionAction createExpandSelectionAction(IPlugInPort plugInPort, ExpansionMode expansionMode) {
return new ExpandSelectionAction(plugInPort, expansionMode); return new ExpandSelectionAction(plugInPort, expansionMode);
} }
@@ -864,6 +868,30 @@ public class ActionFactory {
} }
} }
public static class SaveAsBlockAction extends AbstractAction {
private static final long serialVersionUID = 1L;
private IPlugInPort plugInPort;
public SaveAsBlockAction(IPlugInPort plugInPort) {
super();
this.plugInPort = plugInPort;
putValue(AbstractAction.NAME, "Save as Building Block");
putValue(AbstractAction.SMALL_ICON, IconLoader.ComponentAdd.getIcon());
}
@Override
public void actionPerformed(ActionEvent e) {
LOG.info("Save as building block triggered");
String templateName =
JOptionPane.showInputDialog(null, "Block name:", "Save as Building Block", JOptionPane.PLAIN_MESSAGE);
if (templateName != null && !templateName.trim().isEmpty()) {
plugInPort.saveSelectionAsBlock(templateName);
}
}
}
public static class ExpandSelectionAction extends AbstractAction { public static class ExpandSelectionAction extends AbstractAction {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@@ -65,6 +65,7 @@ public class CanvasPlugin implements IPlugIn, ClipboardOwner {
private ActionFactory.EditSelectionAction editSelectionAction; private ActionFactory.EditSelectionAction editSelectionAction;
private ActionFactory.DeleteSelectionAction deleteSelectionAction; private ActionFactory.DeleteSelectionAction deleteSelectionAction;
private ActionFactory.SaveAsTemplateAction saveAsTemplateAction; private ActionFactory.SaveAsTemplateAction saveAsTemplateAction;
private ActionFactory.SaveAsBlockAction saveAsBlockAction;
private ActionFactory.GroupAction groupAction; private ActionFactory.GroupAction groupAction;
private ActionFactory.UngroupAction ungroupAction; private ActionFactory.UngroupAction ungroupAction;
private ActionFactory.SendToBackAction sendToBackAction; private ActionFactory.SendToBackAction sendToBackAction;
@@ -154,6 +155,7 @@ public class CanvasPlugin implements IPlugIn, ClipboardOwner {
getMirrorVerticallyAction().setEnabled(enabled); getMirrorVerticallyAction().setEnabled(enabled);
getSaveAsTemplateAction().setEnabled(plugInPort.getSelectedComponents().size() == 1); getSaveAsTemplateAction().setEnabled(plugInPort.getSelectedComponents().size() == 1);
getSaveAsBlockAction().setEnabled(plugInPort.getSelectedComponents().size() > 1);
showPopupAt(e.getX(), e.getY()); showPopupAt(e.getX(), e.getY());
} }
@@ -265,6 +267,7 @@ public class CanvasPlugin implements IPlugIn, ClipboardOwner {
popupMenu.add(getTransformMenu()); popupMenu.add(getTransformMenu());
popupMenu.add(getSaveAsTemplateAction()); popupMenu.add(getSaveAsTemplateAction());
popupMenu.add(getApplyTemplateMenu()); popupMenu.add(getApplyTemplateMenu());
popupMenu.add(getSaveAsBlockAction());
popupMenu.add(getExpandMenu()); popupMenu.add(getExpandMenu());
popupMenu.addSeparator(); popupMenu.addSeparator();
popupMenu.add(ActionFactory.getInstance().createEditProjectAction(plugInPort)); popupMenu.add(ActionFactory.getInstance().createEditProjectAction(plugInPort));
@@ -439,6 +442,13 @@ public class CanvasPlugin implements IPlugIn, ClipboardOwner {
return saveAsTemplateAction; return saveAsTemplateAction;
} }
public ActionFactory.SaveAsBlockAction getSaveAsBlockAction() {
if (saveAsBlockAction == null) {
saveAsBlockAction = ActionFactory.getInstance().createSaveAsBlockAction(plugInPort);
}
return saveAsBlockAction;
}
public ActionFactory.GroupAction getGroupAction() { public ActionFactory.GroupAction getGroupAction() {
if (groupAction == null) { if (groupAction == null) {
groupAction = ActionFactory.getInstance().createGroupAction(plugInPort); groupAction = ActionFactory.getInstance().createGroupAction(plugInPort);
@@ -47,6 +47,7 @@ public class EditMenuPlugin implements IPlugIn, ClipboardOwner {
private ActionFactory.ExpandSelectionAction expandSelectionImmediateAction; private ActionFactory.ExpandSelectionAction expandSelectionImmediateAction;
private ActionFactory.ExpandSelectionAction expandSelectionSameTypeAction; private ActionFactory.ExpandSelectionAction expandSelectionSameTypeAction;
private ActionFactory.SaveAsTemplateAction saveAsTemplateAction; private ActionFactory.SaveAsTemplateAction saveAsTemplateAction;
private ActionFactory.SaveAsBlockAction saveAsBlockAction;
private ActionFactory.RotateSelectionAction rotateClockwiseAction; private ActionFactory.RotateSelectionAction rotateClockwiseAction;
private ActionFactory.RotateSelectionAction rotateCounterClockwiseAction; private ActionFactory.RotateSelectionAction rotateCounterClockwiseAction;
private ActionFactory.MirrorSelectionAction mirrorHorizontallyAction; private ActionFactory.MirrorSelectionAction mirrorHorizontallyAction;
@@ -188,6 +189,13 @@ public class EditMenuPlugin implements IPlugIn, ClipboardOwner {
return saveAsTemplateAction; return saveAsTemplateAction;
} }
public ActionFactory.SaveAsBlockAction getSaveAsBlockAction() {
if (saveAsBlockAction == null) {
saveAsBlockAction = ActionFactory.getInstance().createSaveAsBlockAction(plugInPort);
}
return saveAsBlockAction;
}
public ActionFactory.RotateSelectionAction getRotateClockwiseAction() { public ActionFactory.RotateSelectionAction getRotateClockwiseAction() {
if (rotateClockwiseAction == null) { if (rotateClockwiseAction == null) {
rotateClockwiseAction = ActionFactory.getInstance().createRotateSelectionAction(plugInPort, 1); rotateClockwiseAction = ActionFactory.getInstance().createRotateSelectionAction(plugInPort, 1);
@@ -306,6 +314,7 @@ public class EditMenuPlugin implements IPlugIn, ClipboardOwner {
getMirrorHorizontallyAction().setEnabled(enabled); getMirrorHorizontallyAction().setEnabled(enabled);
getMirrorVerticallyAction().setEnabled(enabled); getMirrorVerticallyAction().setEnabled(enabled);
getSaveAsTemplateAction().setEnabled(enabled); getSaveAsTemplateAction().setEnabled(enabled);
getSaveAsBlockAction().setEnabled(enabled);
} }
// ClipboardOwner // ClipboardOwner
@@ -39,9 +39,9 @@ public class HelpMenuPlugin implements IPlugIn {
public HelpMenuPlugin(ISwingUI swingUI) { public HelpMenuPlugin(ISwingUI swingUI) {
swingUI.injectMenuAction(new NavigateURLAction("User Manual", IconLoader.Manual.getIcon(), MANUAL_URL), HELP_TITLE); swingUI.injectMenuAction(new NavigateURLAction("User Manual", IconLoader.Manual.getIcon(), MANUAL_URL), HELP_TITLE);
swingUI.injectMenuAction(new NavigateURLAction("FAQ", IconLoader.Faq.getIcon(), FAQ_URL), HELP_TITLE); swingUI.injectMenuAction(new NavigateURLAction("FAQ", IconLoader.Faq.getIcon(), FAQ_URL), HELP_TITLE);
swingUI.injectMenuAction(new NavigateURLAction("Component API", IconLoader.Component.getIcon(), COMPONENT_URL), swingUI.injectMenuAction(new NavigateURLAction("Component API", IconLoader.CoffeebeanEdit.getIcon(), COMPONENT_URL),
HELP_TITLE); HELP_TITLE);
swingUI.injectMenuAction(new NavigateURLAction("Plugin API", IconLoader.Plugin.getIcon(), PLUGIN_URL), HELP_TITLE); swingUI.injectMenuAction(new NavigateURLAction("Plugin API", IconLoader.ApplicationEdit.getIcon(), PLUGIN_URL), HELP_TITLE);
swingUI.injectMenuAction(new NavigateURLAction("Submit a Bug", IconLoader.Bug.getIcon(), BUG_URL), HELP_TITLE); swingUI.injectMenuAction(new NavigateURLAction("Submit a Bug", IconLoader.Bug.getIcon(), BUG_URL), HELP_TITLE);
swingUI.injectMenuAction(null, HELP_TITLE); swingUI.injectMenuAction(null, HELP_TITLE);
swingUI.injectMenuAction(new NavigateURLAction("Donate", IconLoader.Donate.getIcon(), DONATE_URL), HELP_TITLE); swingUI.injectMenuAction(new NavigateURLAction("Donate", IconLoader.Donate.getIcon(), DONATE_URL), HELP_TITLE);
@@ -13,7 +13,9 @@ import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent; import java.awt.event.FocusEvent;
import java.awt.event.MouseAdapter; import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
@@ -43,6 +45,7 @@ import org.apache.log4j.Logger;
import org.diylc.appframework.miscutils.ConfigurationManager; import org.diylc.appframework.miscutils.ConfigurationManager;
import org.diylc.appframework.miscutils.IConfigListener; import org.diylc.appframework.miscutils.IConfigListener;
import org.diylc.common.ComponentType; import org.diylc.common.ComponentType;
import org.diylc.common.IBlockProcessor.InvalidBlockException;
import org.diylc.common.IPlugInPort; import org.diylc.common.IPlugInPort;
import org.diylc.core.IDIYComponent; import org.diylc.core.IDIYComponent;
import org.diylc.core.Template; import org.diylc.core.Template;
@@ -61,7 +64,9 @@ public class TreePanel extends JPanel {
private JScrollPane treeScroll; private JScrollPane treeScroll;
private JTextField searchField; private JTextField searchField;
private DefaultMutableTreeNode recentNode; private DefaultMutableTreeNode recentNode;
private DefaultMutableTreeNode blocksNode;
private List<String> recentComponents; private List<String> recentComponents;
private List<String> blocks;
private IPlugInPort plugInPort; private IPlugInPort plugInPort;
@@ -96,15 +101,35 @@ public class TreePanel extends JPanel {
@Override @Override
public void valueChanged(String key, Object value) { public void valueChanged(String key, Object value) {
List<String> newComponents = (List<String>) value; List<String> newComponents = (List<String>) value;
if (!new HashSet<String>(newComponents).equals(new HashSet<String>(TreePanel.this.recentComponents))) { if (newComponents != null
LOG.info("Detected change"); && !new HashSet<String>(newComponents).equals(new HashSet<String>(TreePanel.this.recentComponents))) {
refreshRecentComponentsToolbar(newComponents); LOG.info("Detected recent component change");
refreshRecentComponents(newComponents);
} else } else
LOG.info("Detected no change"); LOG.info("Detected no recent component change");
TreePanel.this.recentComponents = new ArrayList<String>(newComponents); TreePanel.this.recentComponents = new ArrayList<String>(newComponents);
} }
}); });
ConfigurationManager.getInstance().addConfigListener(IPlugInPort.BLOCKS_KEY, new IConfigListener() {
@SuppressWarnings("unchecked")
@Override
public void valueChanged(String key, Object value) {
Map<String, Collection<IDIYComponent<?>>> newBlocks = (Map<String, Collection<IDIYComponent<?>>>) value;
if (newBlocks != null) {
List<String> blockNames = new ArrayList<String>(newBlocks.keySet());
Collections.sort(blockNames);
if (!blockNames.equals(TreePanel.this.blocks)) {
LOG.info("Detected block change");
refreshBlocks(blockNames);
} else
LOG.info("Detected no block change");
} else
LOG.info("Detected no block change");
}
});
getTree().expandRow(0); getTree().expandRow(0);
} }
@@ -118,13 +143,13 @@ public class TreePanel extends JPanel {
public DefaultMutableTreeNode getRecentNode() { public DefaultMutableTreeNode getRecentNode() {
if (this.recentNode == null) { if (this.recentNode == null) {
this.recentNode = new DefaultMutableTreeNode(new Payload("(Recently Used)"), true); this.recentNode = new DefaultMutableTreeNode(new Payload("(Recently Used)", null), true);
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
List<String> recent = List<String> recent =
(List<String>) ConfigurationManager.getInstance().readObject(IPlugInPort.RECENT_COMPONENTS_KEY, null); (List<String>) ConfigurationManager.getInstance().readObject(IPlugInPort.RECENT_COMPONENTS_KEY, null);
if (recent != null) { if (recent != null) {
this.recentComponents = new ArrayList<String>(recent); this.recentComponents = new ArrayList<String>(recent);
refreshRecentComponentsToolbar(recent); refreshRecentComponents(recent);
} else { } else {
this.recentComponents = new ArrayList<String>(); this.recentComponents = new ArrayList<String>();
} }
@@ -132,16 +157,41 @@ public class TreePanel extends JPanel {
return this.recentNode; return this.recentNode;
} }
public DefaultMutableTreeNode getBlocksNode() {
if (this.blocksNode == null) {
this.blocksNode = new DefaultMutableTreeNode(new Payload("(Building Blocks)", null), true);
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private void refreshRecentComponentsToolbar(List<String> recentComponentClassList) { Map<String, Collection<IDIYComponent<?>>> newBlocks =
(Map<String, Collection<IDIYComponent<?>>>) ConfigurationManager.getInstance().readObject(
IPlugInPort.BLOCKS_KEY, null);
if (newBlocks != null) {
List<String> blockNames = new ArrayList<String>(newBlocks.keySet());
Collections.sort(blockNames);
refreshBlocks(blockNames);
this.blocks = blockNames;
} else {
this.blocks = new ArrayList<String>();
}
}
return this.blocksNode;
}
@SuppressWarnings("unchecked")
private void refreshRecentComponents(List<String> recentComponentClassList) {
getRecentNode().removeAllChildren(); getRecentNode().removeAllChildren();
for (String componentClassName : recentComponentClassList) { for (String componentClassName : recentComponentClassList) {
ComponentType componentType; final ComponentType componentType;
try { try {
componentType = componentType =
ComponentProcessor.getInstance().extractComponentTypeFrom( ComponentProcessor.getInstance().extractComponentTypeFrom(
(Class<? extends IDIYComponent<?>>) Class.forName(componentClassName)); (Class<? extends IDIYComponent<?>>) Class.forName(componentClassName));
Payload payload = new Payload(componentType); Payload payload = new Payload(componentType, new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
plugInPort.setNewComponentTypeSlot(componentType, null);
}
});
final DefaultMutableTreeNode componentNode = new DefaultMutableTreeNode(payload, false); final DefaultMutableTreeNode componentNode = new DefaultMutableTreeNode(payload, false);
String text = getSearchField().getText(); String text = getSearchField().getText();
boolean visible = boolean visible =
@@ -157,18 +207,51 @@ public class TreePanel extends JPanel {
getTreeModel().nodeStructureChanged(getRecentNode()); getTreeModel().nodeStructureChanged(getRecentNode());
} }
private void refreshBlocks(List<String> blocks) {
getBlocksNode().removeAllChildren();
for (final String block : blocks) {
Payload payload = new Payload(block, new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e)) {
try {
plugInPort.loadBlock(block);
} catch (InvalidBlockException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
});
final DefaultMutableTreeNode componentNode = new DefaultMutableTreeNode(payload, false);
String text = getSearchField().getText();
boolean visible = text.trim().length() == 0 || block.toLowerCase().contains(text.toLowerCase());
payload.setVisible(visible);
getBlocksNode().add(componentNode);
}
getTreeModel().nodeStructureChanged(getBlocksNode());
}
public DefaultTreeModel getTreeModel() { public DefaultTreeModel getTreeModel() {
if (treeModel == null) { if (treeModel == null) {
final DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("Components", true); final DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("Components", true);
rootNode.add(getRecentNode()); rootNode.add(getRecentNode());
rootNode.add(getBlocksNode());
Map<String, List<ComponentType>> componentTypes = plugInPort.getComponentTypes(); Map<String, List<ComponentType>> componentTypes = plugInPort.getComponentTypes();
List<String> categories = new ArrayList<String>(componentTypes.keySet()); List<String> categories = new ArrayList<String>(componentTypes.keySet());
Collections.sort(categories); Collections.sort(categories);
for (String category : categories) { for (String category : categories) {
final DefaultMutableTreeNode categoryNode = new DefaultMutableTreeNode(new Payload(category)); final DefaultMutableTreeNode categoryNode = new DefaultMutableTreeNode(new Payload(category, null));
rootNode.add(categoryNode); rootNode.add(categoryNode);
for (ComponentType type : componentTypes.get(category)) { for (final ComponentType type : componentTypes.get(category)) {
final DefaultMutableTreeNode componentNode = new DefaultMutableTreeNode(new Payload(type), false); final DefaultMutableTreeNode componentNode = new DefaultMutableTreeNode(new Payload(type, new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
plugInPort.setNewComponentTypeSlot(type, null);
}
}), false);
categoryNode.add(componentNode); categoryNode.add(componentNode);
} }
} }
@@ -184,21 +267,6 @@ public class TreePanel extends JPanel {
tree.setCellRenderer(new ComponentCellRenderer()); tree.setCellRenderer(new ComponentCellRenderer());
tree.setRowHeight(0); tree.setRowHeight(0);
ToolTipManager.sharedInstance().registerComponent(tree); ToolTipManager.sharedInstance().registerComponent(tree);
// tree.addTreeSelectionListener(new TreeSelectionListener() {
//
// @Override
// public void valueChanged(TreeSelectionEvent e) {
// Object c = e.getPath().getLastPathComponent();
// if (c != null && c.getClass().equals(DefaultMutableTreeNode.class)) {
// DefaultMutableTreeNode node = (DefaultMutableTreeNode) c;
// Object obj = node.getUserObject();
// if (obj != null && obj.getClass().equals(Payload.class)) {
// Payload payload = (Payload) obj;
// plugInPort.setNewComponentTypeSlot(payload.getComponentType(), null);
// }
// }
// }
// });
tree.addMouseListener(new MouseAdapter() { tree.addMouseListener(new MouseAdapter() {
@@ -208,8 +276,8 @@ public class TreePanel extends JPanel {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent(); DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent();
if (node != null && node.getUserObject() != null) { if (node != null && node.getUserObject() != null) {
Payload payload = (Payload) node.getUserObject(); Payload payload = (Payload) node.getUserObject();
if (payload.getComponentType() != null) { if (payload.getClickListener() != null) {
plugInPort.setNewComponentTypeSlot(payload.getComponentType(), null); payload.getClickListener().mouseClicked(e);
} }
} }
if (SwingUtilities.isRightMouseButton(e)) { if (SwingUtilities.isRightMouseButton(e)) {
@@ -326,12 +394,14 @@ public class TreePanel extends JPanel {
boolean visible = false; boolean visible = false;
if (text.trim().length() == 0) { if (text.trim().length() == 0) {
visible = true; visible = true;
} else { } else if (payload.getComponentType() != null) {
ComponentType type = payload.getComponentType(); ComponentType type = payload.getComponentType();
visible = visible =
type.getName().toLowerCase().contains(text.toLowerCase()) type.getName().toLowerCase().contains(text.toLowerCase())
|| type.getDescription().toLowerCase().contains(text.toLowerCase()) || type.getDescription().toLowerCase().contains(text.toLowerCase())
|| type.getCategory().toLowerCase().contains(text.toLowerCase()); || type.getCategory().toLowerCase().contains(text.toLowerCase());
} else {
visible = payload.toString().toLowerCase().contains(text.toLowerCase());
} }
if (visible != payload.isVisible()) { if (visible != payload.isVisible()) {
payload.setVisible(visible); payload.setVisible(visible);
@@ -351,14 +421,14 @@ public class TreePanel extends JPanel {
model.nodeStructureChanged(rootNode); model.nodeStructureChanged(rootNode);
} }
if (categoryVisible && text.trim().length() > 0) { if (categoryVisible && text.trim().length() > 0) {
tree.expandPath(new TreePath(categoryNode.getPath())); getTree().expandPath(new TreePath(categoryNode.getPath()));
} }
} }
} }
for (int i = 0; i < model.getChildCount(rootNode); i++) { for (int i = 0; i < model.getChildCount(rootNode); i++) {
DefaultMutableTreeNode categoryNode = (DefaultMutableTreeNode) model.getChild(rootNode, i); DefaultMutableTreeNode categoryNode = (DefaultMutableTreeNode) model.getChild(rootNode, i);
tree.expandPath(new TreePath(categoryNode.getPath())); getTree().expandPath(new TreePath(categoryNode.getPath()));
} }
} }
}); });
@@ -378,18 +448,21 @@ public class TreePanel extends JPanel {
Object obj = ((DefaultMutableTreeNode) value).getUserObject(); Object obj = ((DefaultMutableTreeNode) value).getUserObject();
if (obj != null && obj.getClass().equals(Payload.class)) { if (obj != null && obj.getClass().equals(Payload.class)) {
Payload type = (Payload) obj; Payload payload = (Payload) obj;
if (type.getComponentType() == null) { if (payload.getComponentType() == null) {
if (type.isVisible()) setToolTipText(null);
if (leaf)
setIcon(IconLoader.Component.getIcon());
if (payload.isVisible())
setPreferredSize(new Dimension(240, 20)); setPreferredSize(new Dimension(240, 20));
else else
setPreferredSize(new Dimension(0, 0)); setPreferredSize(new Dimension(0, 0));
} else { } else {
setToolTipText("<html><b>" + type.getComponentType().getName() + "</b><br>" setToolTipText("<html><b>" + payload.getComponentType().getName() + "</b><br>"
+ type.getComponentType().getDescription() + "<br>Author: " + type.getComponentType().getAuthor() + payload.getComponentType().getDescription() + "<br>Author: " + payload.getComponentType().getAuthor()
+ "<br><br>Left click to instantiate this component, right click for more options" + "</html>"); + "<br><br>Left click to instantiate this component, right click for more options" + "</html>");
setIcon(type.getComponentType().getIcon()); setIcon(payload.getComponentType().getIcon());
if (type.isVisible()) if (payload.isVisible())
setPreferredSize(new Dimension(240, 32)); setPreferredSize(new Dimension(240, 32));
else else
setPreferredSize(new Dimension(0, 0)); setPreferredSize(new Dimension(0, 0));
@@ -404,16 +477,19 @@ public class TreePanel extends JPanel {
private ComponentType componentType; private ComponentType componentType;
private String category; private String category;
private boolean isVisible; private boolean isVisible;
private MouseListener clickListener;
public Payload(ComponentType componentType) { public Payload(ComponentType componentType, MouseListener clickListener) {
super(); super();
this.componentType = componentType; this.componentType = componentType;
this.clickListener = clickListener;
this.isVisible = true; this.isVisible = true;
} }
public Payload(String category) { public Payload(String category, MouseListener clickListener) {
super(); super();
this.category = category; this.category = category;
this.clickListener = clickListener;
this.isVisible = true; this.isVisible = true;
} }
@@ -429,6 +505,10 @@ public class TreePanel extends JPanel {
this.isVisible = isVisible; this.isVisible = isVisible;
} }
public MouseListener getClickListener() {
return clickListener;
}
@Override @Override
public String toString() { public String toString() {
return componentType == null ? category : componentType.getName(); return componentType == null ? category : componentType.getName();
+4
View File
@@ -1554,6 +1554,10 @@
<releaseDate>2017-01-05 20:00:00.000 CET</releaseDate> <releaseDate>2017-01-05 20:00:00.000 CET</releaseDate>
<name></name> <name></name>
<changes> <changes>
<org.diylc.appframework.update.Change>
<changeType>NEW_FEATURE</changeType>
<description>Ability to quickly save a group of components as a building block and use it later</description>
</org.diylc.appframework.update.Change>
<org.diylc.appframework.update.Change> <org.diylc.appframework.update.Change>
<changeType>NEW_FEATURE</changeType> <changeType>NEW_FEATURE</changeType>
<description>Show/hide rulers</description> <description>Show/hide rulers</description>