package renamed

This commit is contained in:
bancika
2011-01-04 18:44:00 +00:00
parent b38bb5526e
commit 4e935aecc9
163 changed files with 305 additions and 265 deletions
@@ -0,0 +1,29 @@
package org.diylc.plugins.canvas;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.DragGestureListener;
import org.diylc.common.IPlugInPort;
/**
* {@link DragGestureListener} for {@link CanvasPanel}.
*
* @author Branislav Stojkovic
*/
class CanvasGestureListener implements DragGestureListener {
private IPlugInPort presenter;
public CanvasGestureListener(IPlugInPort presenter) {
super();
this.presenter = presenter;
}
@Override
public void dragGestureRecognized(DragGestureEvent dge) {
presenter.dragStarted(dge.getDragOrigin());
dge.startDrag(presenter.getCursorAt(dge.getDragOrigin()), new EmptyTransferable(),
new CanvasSourceListener(presenter));
}
}
@@ -0,0 +1,232 @@
package org.diylc.plugins.canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.Insets;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.dnd.Autoscroll;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragSource;
import java.awt.dnd.DropTarget;
import java.awt.event.ActionEvent;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.VolatileImage;
import java.util.EnumSet;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.JComponent;
import javax.swing.KeyStroke;
import org.diylc.common.DrawOption;
import org.diylc.common.IPlugInPort;
import org.diylc.common.PropertyWrapper;
import org.diylc.gui.DialogFactory;
import org.diylc.gui.editor.PropertyEditorDialog;
import com.diyfever.gui.ButtonDialog;
/**
* GUI class used to draw onto.
*
* @author Branislav Stojkovic
*/
class CanvasPanel extends JComponent implements Autoscroll {
private static final long serialVersionUID = 1L;
private IPlugInPort plugInPort;
private Image bufferImage;
private GraphicsConfiguration screenGraphicsConfiguration;
private static boolean USE_HARDWARE_ACCELLERATION = false;
private static final EnumSet<DrawOption> drawOptions = EnumSet.of(DrawOption.GRID,
DrawOption.SELECTION, DrawOption.ZOOM, DrawOption.ANTIALIASING,
DrawOption.CONTROL_POINTS);
public CanvasPanel(IPlugInPort plugInPort) {
super();
this.plugInPort = plugInPort;
setBackground(Color.white);
setFocusable(true);
initializeListeners();
initializeDnD();
GraphicsEnvironment graphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] devices = graphicsEnvironment.getScreenDevices();
screenGraphicsConfiguration = devices[0].getDefaultConfiguration();
initializeActions();
}
public void invalidateCache() {
bufferImage = null;
}
private void initializeDnD() {
// Initialize drag source recognizer.
DragSource.getDefaultDragSource().createDefaultDragGestureRecognizer(this,
DnDConstants.ACTION_MOVE, new CanvasGestureListener(plugInPort));
// Initialize drop target.
new DropTarget(this, DnDConstants.ACTION_COPY_OR_MOVE,
new CanvasTargetListener(plugInPort), true);
}
private void initializeActions() {
getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "clearSlot");
getActionMap().put("clearSlot", new AbstractAction() {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
CanvasPanel.this.plugInPort.setNewComponentSlot(null);
}
});
}
protected void createBufferImage() {
if (USE_HARDWARE_ACCELLERATION) {
bufferImage = screenGraphicsConfiguration.createCompatibleVolatileImage(getWidth(),
getHeight());
((VolatileImage) bufferImage).validate(screenGraphicsConfiguration);
} else {
bufferImage = createImage(getWidth(), getHeight());
}
Graphics2D g2d = (Graphics2D) bufferImage.getGraphics();
plugInPort.draw(g2d, drawOptions);
}
@Override
public void paint(Graphics g) {
if (plugInPort == null) {
return;
}
if (bufferImage == null) {
createBufferImage();
} else {
Graphics2D g2d = (Graphics2D) bufferImage.getGraphics();
plugInPort.draw(g2d, drawOptions);
}
if (USE_HARDWARE_ACCELLERATION) {
VolatileImage volatileImage = (VolatileImage) bufferImage;
do {
try {
if (volatileImage.contentsLost()) {
createBufferImage();
}
int validation = volatileImage.validate(screenGraphicsConfiguration);
if (validation == VolatileImage.IMAGE_INCOMPATIBLE) {
createBufferImage();
}
g.drawImage(bufferImage, 0, 0, this);
} catch (NullPointerException e) {
createBufferImage();
}
} while (volatileImage == null || volatileImage.contentsLost());
} else {
Graphics2D g2d = (Graphics2D) bufferImage.getGraphics();
plugInPort.draw(g2d, drawOptions);
g.drawImage(bufferImage, 0, 0, this);
bufferImage.flush();
}
}
@Override
public void update(Graphics g) {
paint(g);
}
private void initializeListeners() {
addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
invalidateCache();
invalidate();
}
});
addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
plugInPort.mouseMoved(getMousePosition(), e.isControlDown(), e.isShiftDown(), e
.isAltDown());
}
});
addMouseMotionListener(new MouseAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
setCursor(plugInPort.getCursorAt(e.getPoint()));
plugInPort.mouseMoved(e.getPoint(), e.isControlDown(), e.isShiftDown(), e
.isAltDown());
}
});
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1) {
if (e.getClickCount() == 2) {
List<PropertyWrapper> properties = plugInPort
.getMutualSelectionProperties();
if (properties != null) {
if (properties.isEmpty()) {
} else {
PropertyEditorDialog editor = DialogFactory.getInstance()
.createPropertyEditorDialog(properties);
editor.setVisible(true);
if (ButtonDialog.OK.equals(editor.getSelectedButtonCaption())) {
try {
plugInPort.applyPropertiesToSelection(properties);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
for (PropertyWrapper property : editor.getDefaultedProperties()) {
if (property.getValue() != null) {
plugInPort.setDefaultPropertyValue(property.getName(),
property.getValue());
}
}
}
}
}
} else {
plugInPort.mouseClicked(e.getPoint(), e.isControlDown(), e.isShiftDown(), e
.isAltDown());
}
}
}
});
}
// Autoscroll
@Override
public void autoscroll(Point cursorLocn) {
scrollRectToVisible(new Rectangle(cursorLocn.x - 15, cursorLocn.y - 15, 30, 30));
}
@Override
public Insets getAutoscrollInsets() {
Rectangle rect = getVisibleRect();
return new Insets(rect.y - 15, rect.x - 15, rect.y + rect.height + 15, rect.x + rect.width
+ 15);
}
}
@@ -0,0 +1,120 @@
package org.diylc.plugins.canvas;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.util.EnumSet;
import javax.swing.SwingConstants;
import org.apache.log4j.Logger;
import org.diylc.common.BadPositionException;
import org.diylc.common.EventType;
import org.diylc.common.IPlugIn;
import org.diylc.common.IPlugInPort;
import org.diylc.plugins.file.ProjectDrawingProvider;
import com.diyfever.gui.miscutils.ConfigurationManager;
import com.diyfever.gui.ruler.IRulerListener;
import com.diyfever.gui.ruler.RulerScrollPane;
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;
private IPlugInPort plugInPort;
public CanvasPlugin() {
}
@Override
public void connect(IPlugInPort plugInPort) {
this.plugInPort = plugInPort;
canvasPanel = new CanvasPanel(plugInPort);
try {
plugInPort.injectGUIComponent(getScrollPane(), SwingConstants.CENTER);
} catch (BadPositionException e) {
LOG.error("Could not install canvas plugin", e);
}
}
private RulerScrollPane getScrollPane() {
if (scrollPane == null) {
scrollPane = new RulerScrollPane(canvasPanel, new ProjectDrawingProvider(plugInPort));
Boolean metric = (Boolean) ConfigurationManager.getInstance().getConfigurationItem(
METRIC_KEY);
if (metric == null) {
metric = true;
}
scrollPane.setMetric(metric);
scrollPane.addUnitListener(new IRulerListener() {
@Override
public void unitsChanged(boolean isMetric) {
ConfigurationManager.getInstance().setConfigurationItem(METRIC_KEY, isMetric);
}
});
}
return scrollPane;
}
@Override
public EnumSet<EventType> getSubscribedEventTypes() {
return EnumSet.of(EventType.PROJECT_LOADED, EventType.ZOOM_CHANGED, EventType.REPAINT);
}
@Override
public void processMessage(final EventType eventType, Object... params) {
// SwingUtilities.invokeLater(new Runnable() {
//
// @Override
// public void run() {
// LOG.debug("event: " + eventType);
switch (eventType) {
case PROJECT_LOADED:
refreshSize();
if ((Boolean) params[1]) {
// Scroll to the center.
Rectangle visibleRect = canvasPanel.getVisibleRect();
visibleRect.setLocation((canvasPanel.getWidth() - visibleRect.width) / 2,
(canvasPanel.getHeight() - visibleRect.height) / 2);
canvasPanel.scrollRectToVisible(visibleRect);
canvasPanel.revalidate();
}
// canvasPanel.validate();
// canvasPanel.repaint();
break;
case ZOOM_CHANGED:
refreshSize();
break;
case REPAINT:
canvasPanel.repaint();
break;
}
// }
// });
}
private void refreshSize() {
Dimension d = plugInPort.getCanvasDimensions(true);
canvasPanel.setSize(d);
canvasPanel.setPreferredSize(d);
getScrollPane().setZoomLevel(plugInPort.getZoomLevel());
}
/**
* Causes ruller scroll pane to refresh by sending a fake mouse moved
* message to the canvasPanel.
*/
public void refresh() {
MouseEvent event = new MouseEvent(canvasPanel, MouseEvent.MOUSE_MOVED, System
.currentTimeMillis(), 0, 1, 1,// canvasPanel.getWidth() / 2,
// canvasPanel.getHeight() / 2,
0, false);
canvasPanel.dispatchEvent(event);
}
}
@@ -0,0 +1,50 @@
package org.diylc.plugins.canvas;
import java.awt.Point;
import java.awt.dnd.DragSourceDragEvent;
import java.awt.dnd.DragSourceDropEvent;
import java.awt.dnd.DragSourceEvent;
import java.awt.dnd.DragSourceListener;
import org.diylc.common.IPlugInPort;
/**
* {@link DragSourceListener} for {@link CanvasPanel}.
*
* @author Branislav Stojkovic
*/
class CanvasSourceListener implements DragSourceListener {
private IPlugInPort presenter;
public CanvasSourceListener(IPlugInPort presenter) {
super();
this.presenter = presenter;
}
@Override
public void dragDropEnd(DragSourceDropEvent dsde) {
presenter.dragEnded(null);
}
@Override
public void dragEnter(DragSourceDragEvent dsde) {
}
@Override
public void dragExit(DragSourceEvent dse) {
}
@Override
public void dragOver(DragSourceDragEvent dsde) {
Point p = dsde.getDragSourceContext().getComponent().getMousePosition();
if (p != null) {
dsde.getDragSourceContext().getComponent().firePropertyChange("dragPoint", p.x, p.y);
}
}
@Override
public void dropActionChanged(DragSourceDragEvent dsde) {
}
}
@@ -0,0 +1,95 @@
package org.diylc.plugins.canvas;
import java.awt.Point;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import org.diylc.common.IPlugInPort;
/**
* {@link DropTargetListener} for {@link CanvasPanel}.
*
* @author Branislav Stojkovic
*/
class CanvasTargetListener implements DropTargetListener {
private IPlugInPort presenter;
// Cached values
private Point currentPoint = null;
private boolean lastAccept;
public CanvasTargetListener(IPlugInPort presenter) {
super();
this.presenter = presenter;
}
@Override
public void dragEnter(DropTargetDragEvent dtde) {
}
@Override
public void dragExit(DropTargetEvent dte) {
}
@Override
public void dragOver(DropTargetDragEvent dtde) {
// If dragOver was previously called for this location use cached value.
if (dtde.getLocation().equals(currentPoint)) {
if (lastAccept) {
dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
} else {
dtde.rejectDrag();
}
return;
}
try {
// Transferable t = dtde.getTransferable();
// if
// (t.isDataFlavorSupported(SelectionTransferable.selectionFlavor))
// {
// if (currentPoint != null) {
// List<IComponentInstance> selection = (List<IComponentInstance>) t
// .getTransferData(SelectionTransferable.selectionFlavor);
// Point startPoint = (Point) t
// .getTransferData(PointTransferable.pointFlavor);
// presenter.selectionMoved(dtde.getLocation().x
// - currentPoint.x, dtde.getLocation().y
// - currentPoint.y);
// }
// } else if
// (t.isDataFlavorSupported(PointTransferable.pointFlavor)) {
// Point startPoint = (Point) t
// .getTransferData(PointTransferable.pointFlavor);
// Point endPoint = dtde.getLocation();
// presenter.setSelectionRect(Utils.createRectangle(startPoint,
// endPoint));
// }
currentPoint = dtde.getLocation();
if (presenter.dragOver(currentPoint)) {
dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
lastAccept = true;
} else {
dtde.rejectDrag();
lastAccept = false;
}
} catch (Exception e) {
e.printStackTrace();
dtde.rejectDrag();
lastAccept = false;
}
}
@Override
public void drop(DropTargetDropEvent dtde) {
presenter.dragEnded(dtde.getLocation());
}
@Override
public void dropActionChanged(DropTargetDragEvent dtde) {
}
}
@@ -0,0 +1,24 @@
package org.diylc.plugins.canvas;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
public class EmptyTransferable implements Transferable {
@Override
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
throw new UnsupportedFlavorException(flavor);
}
@Override
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[] {};
}
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
return false;
}
}
@@ -0,0 +1,38 @@
package org.diylc.plugins.canvas;
import java.awt.Point;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
public class PointTransferable implements Transferable {
public static final DataFlavor pointFlavor = new DataFlavor(Point.class, "Java Point");
private Point startPoint;
public PointTransferable(Point startPoint) {
super();
this.startPoint = startPoint;
}
@Override
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
if (flavor.equals(pointFlavor)) {
return startPoint;
}
throw new UnsupportedFlavorException(flavor);
}
@Override
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[] { pointFlavor };
}
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
return flavor.equals(pointFlavor);
}
}
@@ -0,0 +1,47 @@
package org.diylc.plugins.canvas;
import java.awt.Point;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
import java.util.List;
import org.diylc.model.IComponentInstance;
public class SelectionTransferable implements Transferable {
public static final DataFlavor selectionFlavor = new DataFlavor(List.class,
"Component Selection");
private Point startPoint;
private List<IComponentInstance> selection;
public SelectionTransferable(List<IComponentInstance> selection, Point startPoint) {
super();
this.selection = selection;
this.startPoint = startPoint;
}
@Override
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
if (flavor.equals(selectionFlavor)) {
return selection;
}
if (flavor.equals(PointTransferable.pointFlavor)) {
return startPoint;
}
throw new UnsupportedFlavorException(flavor);
}
@Override
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[] { selectionFlavor, PointTransferable.pointFlavor };
}
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
return flavor.equals(selectionFlavor) || flavor.equals(selectionFlavor);
}
}
@@ -0,0 +1,199 @@
package org.diylc.plugins.clipboard;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.FlavorEvent;
import java.awt.datatransfer.FlavorListener;
import java.awt.datatransfer.Transferable;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.util.EnumSet;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.KeyStroke;
import org.apache.log4j.Logger;
import org.diylc.common.ComponentSelection;
import org.diylc.common.EventType;
import org.diylc.common.IPlugIn;
import org.diylc.common.IPlugInPort;
import org.diylc.images.IconLoader;
import org.diylc.model.IComponentInstance;
import org.diylc.model.Project;
import com.diyfever.gui.undo.IUndoListener;
import com.diyfever.gui.undo.UndoHandler;
import com.rits.cloning.Cloner;
public class ClipboardManager implements IPlugIn, ClipboardOwner {
private static final Logger LOG = Logger.getLogger(ClipboardManager.class);
private static final String EDIT_TITLE = "Edit";
private IPlugInPort plugInPort;
private Clipboard clipboard;
private Cloner cloner;
private CutAction cutAction;
private CopyAction copyAction;
private PasteAction pasteAction;
private UndoHandler<Project> undoHandler;
public ClipboardManager() {
clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
cloner = new Cloner();
undoHandler = new UndoHandler<Project>(new IUndoListener<Project>() {
@Override
public void actionPerformed(Project currentState) {
plugInPort.loadProject(currentState, false);
}
});
clipboard.addFlavorListener(new FlavorListener() {
@Override
public void flavorsChanged(FlavorEvent e) {
refreshActions();
}
});
}
@Override
public void connect(IPlugInPort plugInPort) {
this.plugInPort = plugInPort;
plugInPort.injectMenuAction(undoHandler.getUndoAction(), EDIT_TITLE);
plugInPort.injectMenuAction(undoHandler.getRedoAction(), EDIT_TITLE);
plugInPort.injectMenuAction(null, EDIT_TITLE);
cutAction = new CutAction();
plugInPort.injectMenuAction(cutAction, EDIT_TITLE);
copyAction = new CopyAction();
plugInPort.injectMenuAction(copyAction, EDIT_TITLE);
pasteAction = new PasteAction();
plugInPort.injectMenuAction(pasteAction, EDIT_TITLE);
plugInPort.injectMenuAction(null, EDIT_TITLE);
plugInPort.injectMenuAction(new SelectAllAction(), EDIT_TITLE);
refreshActions();
}
@Override
public EnumSet<EventType> getSubscribedEventTypes() {
return EnumSet.of(EventType.SELECTION_CHANGED, EventType.PROJECT_MODIFIED);
}
@Override
public void processMessage(EventType eventType, Object... params) {
switch (eventType) {
case SELECTION_CHANGED:
refreshActions();
break;
case PROJECT_MODIFIED:
undoHandler.stateChanged((Project) params[0], (Project) params[1], (String) params[2]);
break;
}
}
private void refreshActions() {
boolean enabled = !plugInPort.getSelectedComponents().isEmpty();
cutAction.setEnabled(enabled);
copyAction.setEnabled(enabled);
try {
pasteAction.setEnabled(clipboard.isDataFlavorAvailable(ComponentSelection.listFlavor));
} catch (Exception e) {
pasteAction.setEnabled(false);
}
}
class CutAction extends AbstractAction {
private static final long serialVersionUID = 1L;
public CutAction() {
super();
putValue(AbstractAction.NAME, "Cut");
putValue(AbstractAction.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_X,
ActionEvent.CTRL_MASK));
putValue(AbstractAction.SMALL_ICON, IconLoader.Cut.getIcon());
}
@Override
public void actionPerformed(ActionEvent e) {
LOG.info("Cut triggered");
}
}
class CopyAction extends AbstractAction {
private static final long serialVersionUID = 1L;
public CopyAction() {
super();
putValue(AbstractAction.NAME, "Copy");
putValue(AbstractAction.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_C,
ActionEvent.CTRL_MASK));
putValue(AbstractAction.SMALL_ICON, IconLoader.Copy.getIcon());
}
@Override
public void actionPerformed(ActionEvent e) {
LOG.info("Copy triggered");
clipboard.setContents(cloner.deepClone(plugInPort.getSelectedComponents()),
ClipboardManager.this);
}
}
class PasteAction extends AbstractAction {
private static final long serialVersionUID = 1L;
public PasteAction() {
super();
putValue(AbstractAction.NAME, "Paste");
putValue(AbstractAction.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_V,
ActionEvent.CTRL_MASK));
putValue(AbstractAction.SMALL_ICON, IconLoader.Paste.getIcon());
}
@SuppressWarnings("unchecked")
@Override
public void actionPerformed(ActionEvent e) {
LOG.info("Paste triggered");
try {
List<IComponentInstance> components = (List<IComponentInstance>) clipboard
.getData(ComponentSelection.listFlavor);
plugInPort.addComponents(cloner.deepClone(components), null);
} catch (Exception ex) {
LOG.error("Coule not paste.", ex);
}
}
}
class SelectAllAction extends AbstractAction {
private static final long serialVersionUID = 1L;
public SelectAllAction() {
super();
putValue(AbstractAction.NAME, "Select All");
putValue(AbstractAction.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_A,
ActionEvent.CTRL_MASK));
putValue(AbstractAction.SMALL_ICON, IconLoader.Selection.getIcon());
}
@Override
public void actionPerformed(ActionEvent e) {
LOG.info("Select All triggered");
}
}
// ClipboardOwner
@Override
public void lostOwnership(Clipboard clipboard, Transferable contents) {
refreshActions();
}
}
@@ -0,0 +1,180 @@
package org.diylc.plugins.file;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import org.diylc.gui.DialogFactory;
import org.diylc.images.IconLoader;
import com.diyfever.gui.export.TableExporter;
import com.diyfever.gui.objecttable.ObjectListTable;
public class BomDialog extends JDialog {
private static final long serialVersionUID = 1L;
private ObjectListTable<BomEntry> table;
private JPanel toolbar;
public BomDialog(JFrame parent, List<BomEntry> bom) {
super(parent, "Bill of Materials");
setContentPane(createMainPanel());
getTable().setData(bom);
pack();
setLocationRelativeTo(parent);
}
@Override
public void setVisible(boolean b) {
super.setVisible(b);
if (b) {
getTable().autoFit(Arrays.asList(3));
}
}
private JPanel createMainPanel() {
JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BorderLayout());
mainPanel.add(getToolbar(), BorderLayout.NORTH);
mainPanel.add(new JScrollPane(getTable()), BorderLayout.CENTER);
return mainPanel;
}
private ObjectListTable<BomEntry> getTable() {
if (table == null) {
try {
table = new ObjectListTable<BomEntry>(BomEntry.class, new String[] { "getName",
"getValue", "getQuantity", "getNotes/setNotes" }, null);
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
return table;
}
private JPanel getToolbar() {
if (toolbar == null) {
toolbar = new JPanel();
toolbar.add(new JButton(new SaveToExcelAction()));
toolbar.add(new JButton(new SaveToCSVAction()));
toolbar.add(new JButton(new SaveToPNGAction()));
toolbar.add(new JButton(new SaveToHTMLAction()));
}
return toolbar;
}
class SaveToExcelAction extends AbstractAction {
private static final long serialVersionUID = 1L;
public SaveToExcelAction() {
super();
putValue(Action.NAME, "Save to Excel");
putValue(Action.SMALL_ICON, IconLoader.Excel.getIcon());
}
@Override
public void actionPerformed(ActionEvent e) {
File file = DialogFactory.getInstance().showSaveDialog(
FileFilterEnum.EXCEL.getFilter(), null,
FileFilterEnum.EXCEL.getExtensions()[0], null);
if (file != null) {
try {
TableExporter.getInstance().exportToExcel(getTable(), file);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
class SaveToCSVAction extends AbstractAction {
private static final long serialVersionUID = 1L;
public SaveToCSVAction() {
super();
putValue(Action.NAME, "Save to CSV");
putValue(Action.SMALL_ICON, IconLoader.CSV.getIcon());
}
@Override
public void actionPerformed(ActionEvent e) {
File file = DialogFactory.getInstance().showSaveDialog(FileFilterEnum.CSV.getFilter(),
null, FileFilterEnum.CSV.getExtensions()[0], null);
if (file != null) {
try {
TableExporter.getInstance().exportToCSV(getTable(), file);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
class SaveToHTMLAction extends AbstractAction {
private static final long serialVersionUID = 1L;
public SaveToHTMLAction() {
super();
putValue(Action.NAME, "Save to HTML");
putValue(Action.SMALL_ICON, IconLoader.HTML.getIcon());
}
@Override
public void actionPerformed(ActionEvent e) {
File file = DialogFactory.getInstance().showSaveDialog(FileFilterEnum.HTML.getFilter(),
null, FileFilterEnum.HTML.getExtensions()[0], null);
if (file != null) {
try {
TableExporter.getInstance().exportToHTML(getTable(), file);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
class SaveToPNGAction extends AbstractAction {
private static final long serialVersionUID = 1L;
public SaveToPNGAction() {
super();
putValue(Action.NAME, "Save to PNG");
putValue(Action.SMALL_ICON, IconLoader.Image.getIcon());
}
@Override
public void actionPerformed(ActionEvent e) {
File file = DialogFactory.getInstance().showSaveDialog(FileFilterEnum.PNG.getFilter(),
null, FileFilterEnum.PNG.getExtensions()[0], null);
if (file != null) {
try {
TableExporter.getInstance().exportToPNG(getTable(), file);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
}
@@ -0,0 +1,89 @@
package org.diylc.plugins.file;
public class BomEntry {
private String name;
private String value;
private Integer quantity;
private String notes;
public BomEntry(String name, String value, int quantity) {
super();
this.name = name;
this.value = value;
this.quantity = quantity;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public Integer getQuantity() {
return quantity;
}
public void setQuantity(Integer quantity) {
this.quantity = quantity;
}
public String getNotes() {
return notes;
}
public void setNotes(String notes) {
this.notes = notes;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((notes == null) ? 0 : notes.hashCode());
result = prime * result + quantity;
result = prime * result + ((value == null) ? 0 : value.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
BomEntry other = (BomEntry) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (notes == null) {
if (other.notes != null)
return false;
} else if (!notes.equals(other.notes))
return false;
if (quantity != other.quantity)
return false;
if (value == null) {
if (other.value != null)
return false;
} else if (!value.equals(other.value))
return false;
return true;
}
}
@@ -0,0 +1,57 @@
package org.diylc.plugins.file;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.diylc.model.IComponentInstance;
import org.diylc.presenter.ComponentProcessor;
public class BomMaker {
private static BomMaker instance;
public static BomMaker getInstance() {
if (instance == null) {
instance = new BomMaker();
}
return instance;
}
private BomMaker() {
}
public List<BomEntry> createBom(List<IComponentInstance> components) {
Map<String, BomEntry> entryMap = new HashMap<String, BomEntry>();
for (IComponentInstance component : components) {
String name = ComponentProcessor.getInstance().extractBomName(component);
String value = ComponentProcessor.getInstance().extractBomValue(component);
if ((name != null) && (value != null)) {
String key = name + "|" + value;
if (entryMap.containsKey(key)) {
BomEntry entry = entryMap.get(key);
entry.setQuantity(entry.getQuantity() + 1);
} else {
entryMap.put(key, new BomEntry(name, value, 1));
}
}
}
List<BomEntry> bom = new ArrayList<BomEntry>(entryMap.values());
Collections.sort(bom, new Comparator<BomEntry>() {
@Override
public int compare(BomEntry o1, BomEntry o2) {
int compare = o1.getName().compareToIgnoreCase(o2.getName());
if (compare != 0) {
return compare;
}
return o1.getValue().compareToIgnoreCase(o2.getValue());
}
});
return bom;
}
}
@@ -0,0 +1,46 @@
package org.diylc.plugins.file;
import java.io.File;
import javax.swing.filechooser.FileFilter;
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");
FileFilter filter;
String[] extensions;
private FileFilterEnum(final String description, final String... extensions) {
this.extensions = extensions;
filter = new FileFilter() {
@Override
public boolean accept(File f) {
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;
}
}
@@ -0,0 +1,275 @@
package org.diylc.plugins.file;
import java.awt.event.ActionEvent;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.EnumSet;
import java.util.List;
import javax.swing.AbstractAction;
import org.apache.log4j.Logger;
import org.diylc.common.EventType;
import org.diylc.common.IPlugIn;
import org.diylc.common.IPlugInPort;
import org.diylc.gui.DialogFactory;
import org.diylc.images.IconLoader;
import org.diylc.model.Project;
import com.diyfever.gui.export.DrawingExporter;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
/**
* Entry point class for File management utilities.
*
* @author Branislav Stojkovic
*/
public class FileManager implements IPlugIn {
private static final Logger LOG = Logger.getLogger(FileManager.class);
private static final String FILE_TITLE = "File";
private IPlugInPort plugInPort;
private ProjectDrawingProvider drawingProvider;
private XStream xStream = new XStream(new DomDriver());
@Override
public void connect(IPlugInPort plugInPort) {
this.plugInPort = plugInPort;
this.drawingProvider = new ProjectDrawingProvider(plugInPort);
plugInPort.injectMenuAction(new NewAction(), FILE_TITLE);
plugInPort.injectMenuAction(new OpenAction(), FILE_TITLE);
plugInPort.injectMenuAction(new SaveAction(), FILE_TITLE);
plugInPort.injectMenuAction(new SaveAsAction(), FILE_TITLE);
plugInPort.injectMenuAction(null, FILE_TITLE);
plugInPort.injectMenuAction(new CreateBomAction(), FILE_TITLE);
plugInPort.injectMenuAction(null, FILE_TITLE);
plugInPort.injectMenuAction(new ExportPDFAction(), FILE_TITLE);
plugInPort.injectMenuAction(new ExportPNGAction(), FILE_TITLE);
plugInPort.injectMenuAction(new PrintAction(), FILE_TITLE);
plugInPort.injectMenuAction(null, FILE_TITLE);
plugInPort.injectMenuAction(new ExitAction(), FILE_TITLE);
}
class NewAction extends AbstractAction {
private static final long serialVersionUID = 1L;
public NewAction() {
super();
putValue(AbstractAction.NAME, "New");
putValue(AbstractAction.SMALL_ICON, IconLoader.DocumentPlainYellow.getIcon());
}
@Override
public void actionPerformed(ActionEvent e) {
LOG.info("Creating blank project.");
plugInPort.loadProject(new Project(), true);
}
}
class OpenAction extends AbstractAction {
private static final long serialVersionUID = 1L;
public OpenAction() {
super();
putValue(AbstractAction.NAME, "Open");
putValue(AbstractAction.SMALL_ICON, IconLoader.FolderOut.getIcon());
}
@Override
public void actionPerformed(ActionEvent e) {
File file = DialogFactory.getInstance().showOpenDialog(FileFilterEnum.DIY.getFilter(),
null, FileFilterEnum.DIY.getExtensions()[0], new ProjectPreview());
if (file != null) {
LOG.info("Loading project from file.");
FileInputStream fis;
try {
fis = new FileInputStream(file);
Project project = (Project) xStream.fromXML(fis);
plugInPort.loadProject(project, true);
fis.close();
} catch (FileNotFoundException ex) {
// TODO Auto-generated catch block
ex.printStackTrace();
} catch (IOException ex) {
// TODO Auto-generated catch block
ex.printStackTrace();
}
}
}
}
class SaveAction extends AbstractAction {
private static final long serialVersionUID = 1L;
public SaveAction() {
super();
putValue(AbstractAction.NAME, "Save");
putValue(AbstractAction.SMALL_ICON, IconLoader.DiskBlue.getIcon());
}
@Override
public void actionPerformed(ActionEvent e) {
File file = DialogFactory.getInstance().showSaveDialog(FileFilterEnum.DIY.getFilter(),
null, FileFilterEnum.DIY.getExtensions()[0], new ProjectPreview());
if (file != null) {
LOG.info("Saving project to file.");
FileOutputStream fos;
try {
fos = new FileOutputStream(file);
xStream.toXML(plugInPort.getCurrentProject(), fos);
fos.close();
} catch (FileNotFoundException ex) {
// TODO Auto-generated catch block
ex.printStackTrace();
} catch (IOException ex) {
// TODO Auto-generated catch block
ex.printStackTrace();
}
}
}
}
class SaveAsAction extends AbstractAction {
private static final long serialVersionUID = 1L;
public SaveAsAction() {
super();
putValue(AbstractAction.NAME, "Save As");
putValue(AbstractAction.SMALL_ICON, IconLoader.DiskBlue.getIcon());
}
@Override
public void actionPerformed(ActionEvent e) {
File file = DialogFactory.getInstance().showSaveDialog(FileFilterEnum.DIY.getFilter(),
null, FileFilterEnum.DIY.getExtensions()[0], new ProjectPreview());
if (file != null) {
LOG.info("Saving project to file.");
FileOutputStream fos;
try {
fos = new FileOutputStream(file);
xStream.toXML(plugInPort.getCurrentProject(), fos);
fos.close();
} catch (FileNotFoundException ex) {
// TODO Auto-generated catch block
ex.printStackTrace();
} catch (IOException ex) {
// TODO Auto-generated catch block
ex.printStackTrace();
}
}
}
}
class CreateBomAction extends AbstractAction {
private static final long serialVersionUID = 1L;
public CreateBomAction() {
super();
putValue(AbstractAction.NAME, "Create B.O.M.");
putValue(AbstractAction.SMALL_ICON, IconLoader.BOM.getIcon());
}
@Override
public void actionPerformed(ActionEvent e) {
List<BomEntry> bom = BomMaker.getInstance().createBom(
plugInPort.getCurrentProject().getComponents());
BomDialog dialog = DialogFactory.getInstance().createBomDialog(bom);
dialog.setVisible(true);
}
}
class ExportPDFAction extends AbstractAction {
private static final long serialVersionUID = 1L;
public ExportPDFAction() {
super();
putValue(AbstractAction.NAME, "Export to PDF");
putValue(AbstractAction.SMALL_ICON, IconLoader.PDF.getIcon());
}
@Override
public void actionPerformed(ActionEvent e) {
File file = DialogFactory.getInstance().showSaveDialog(FileFilterEnum.PDF.getFilter(),
null, FileFilterEnum.PDF.getExtensions()[0], null);
if (file != null) {
DrawingExporter.getInstance().exportPDF(drawingProvider, file);
}
}
}
class ExportPNGAction extends AbstractAction {
private static final long serialVersionUID = 1L;
public ExportPNGAction() {
super();
putValue(AbstractAction.NAME, "Export to PNG");
putValue(AbstractAction.SMALL_ICON, IconLoader.Image.getIcon());
}
@Override
public void actionPerformed(ActionEvent e) {
File file = DialogFactory.getInstance().showSaveDialog(FileFilterEnum.PNG.getFilter(),
null, FileFilterEnum.PNG.getExtensions()[0], null);
if (file != null) {
DrawingExporter.getInstance().exportPNG(drawingProvider, file);
}
}
}
class PrintAction extends AbstractAction {
private static final long serialVersionUID = 1L;
public PrintAction() {
super();
putValue(AbstractAction.NAME, "Print...");
putValue(AbstractAction.SMALL_ICON, IconLoader.Print.getIcon());
}
@Override
public void actionPerformed(ActionEvent e) {
DrawingExporter.getInstance().print(drawingProvider);
}
}
class ExitAction extends AbstractAction {
private static final long serialVersionUID = 1L;
public ExitAction() {
super();
putValue(AbstractAction.NAME, "Exit");
putValue(AbstractAction.SMALL_ICON, IconLoader.Exit.getIcon());
}
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
}
@Override
public EnumSet<EventType> getSubscribedEventTypes() {
return null;
}
@Override
public void processMessage(EventType eventType, Object... params) {
// TODO Auto-generated method stub
}
}
@@ -0,0 +1,37 @@
package org.diylc.plugins.file;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.EnumSet;
import org.diylc.common.DrawOption;
import org.diylc.common.IPlugInPort;
import com.diyfever.gui.IDrawingProvider;
/**
* {@link IDrawingProvider} implementation that uses {@link IPlugInPort} to draw
* a project onto the canvas.
*
* @author Branislav Stojkovic
*/
public class ProjectDrawingProvider implements IDrawingProvider {
IPlugInPort plugInPort;
public ProjectDrawingProvider(IPlugInPort plugInPort) {
super();
this.plugInPort = plugInPort;
}
@Override
public void draw(Graphics g) {
plugInPort.draw((Graphics2D) g, EnumSet.of(DrawOption.ZOOM, DrawOption.ANTIALIASING));
}
@Override
public Dimension getSize() {
return plugInPort.getCanvasDimensions(true);
}
}
@@ -0,0 +1,162 @@
package org.diylc.plugins.file;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.FileInputStream;
import java.util.EnumSet;
import javax.swing.Action;
import javax.swing.Icon;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JPanel;
import org.diylc.common.BadPositionException;
import org.diylc.common.DrawOption;
import org.diylc.common.IPlugInPort;
import org.diylc.gui.IView;
import org.diylc.model.Project;
import org.diylc.presenter.Presenter;
import com.diyfever.gui.IFileChooserAccessory;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
/**
* {@link JComponent} that shows preview of the selected project in
* {@link JFileChooser}. It's hooked onto {@link JFileChooser} as
* {@link PropertyChangeListener} and refreshes when file is selected.
*
* @author Branislav Stojkovic
*/
public class ProjectPreview extends JPanel implements PropertyChangeListener, IFileChooserAccessory {
private static final long serialVersionUID = 1L;
private IPlugInPort presenter;
private XStream xStream;
private Project emptyProject;
private RenderComponent renderComponent;
private JLabel nameLabel;
public ProjectPreview() {
super();
setPreferredSize(new Dimension(140, 128));
presenter = new Presenter(new IView() {
@Override
public void addComponent(JComponent component, int position)
throws BadPositionException {
}
@Override
public void addMenuAction(Action action, String menuName) {
}
@Override
public void setCursorIcon(Icon icon) {
}
});
xStream = new XStream(new DomDriver());
emptyProject = new Project();
emptyProject.setTitle("");
renderComponent = new RenderComponent();
nameLabel = new JLabel();
// setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
add(renderComponent);
add(nameLabel);
}
// PropertyChangeListener
@Override
public void propertyChange(PropertyChangeEvent evt) {
boolean update = false;
String prop = evt.getPropertyName();
Project selectedProject = emptyProject;
if (JFileChooser.DIRECTORY_CHANGED_PROPERTY.equals(prop)) {
update = true;
} else if (JFileChooser.SELECTED_FILE_CHANGED_PROPERTY.equals(prop)) {
File selectedFile = (File) evt.getNewValue();
try {
FileInputStream in = new FileInputStream(selectedFile);
selectedProject = (Project) xStream.fromXML(in);
in.close();
} catch (Exception e) {
}
update = true;
}
nameLabel.setText(selectedProject.getTitle());
presenter.loadProject(selectedProject, true);
if (update) {
if (renderComponent.isShowing()) {
renderComponent.repaint();
}
}
}
class RenderComponent extends JComponent {
private static final long serialVersionUID = 1L;
public RenderComponent() {
setPreferredSize(new Dimension(128, 96));
// setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 4));
}
@Override
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2d = (Graphics2D) g;
Dimension d = presenter.getCanvasDimensions(false);
// System.out.println(d);
Rectangle rect = getBounds();
// System.out.println(rect);
double projectRatio = d.getWidth() / d.getHeight();
double actualRatio = rect.getWidth() / rect.getHeight();
double zoomRatio;
if (projectRatio > actualRatio) {
zoomRatio = rect.getWidth() / d.getWidth();
} else {
zoomRatio = rect.getHeight() / d.getHeight();
}
System.out.println(zoomRatio);
// d.setSize(d.getWidth() * zoomRatio, d.getHeight() * zoomRatio);
int x = (int) (rect.getWidth() - d.getWidth() * zoomRatio) / 2;
int y = (int) (rect.getHeight() - d.getHeight() * zoomRatio) / 2;
// System.out.println(x + "," + y);
g2d.translate(x, y);
g2d.scale(zoomRatio, zoomRatio);
presenter.draw(g2d, EnumSet.noneOf(DrawOption.class));
g2d.setColor(Color.black);
g2d.drawRect(0, 0, d.width - (int) (1 / zoomRatio), d.height - (int) (1 / zoomRatio));
}
}
// IFileChooserAccessory
@Override
public void install(JFileChooser fileChooser) {
fileChooser.setAccessory(this);
fileChooser.addPropertyChangeListener(this);
}
}
@@ -0,0 +1,69 @@
package org.diylc.plugins.help;
import java.awt.event.ActionEvent;
import java.util.EnumSet;
import javax.swing.AbstractAction;
import org.diylc.common.EventType;
import org.diylc.common.IPlugIn;
import org.diylc.common.IPlugInPort;
import org.diylc.gui.DialogFactory;
import org.diylc.images.IconLoader;
import com.diyfever.gui.AboutDialog;
/**
* Entry point class for help-related utilities.
*
* @author Branislav Stojkovic
*/
public class HelpManager implements IPlugIn {
private static final String HELP_TITLE = "Help";
private IPlugInPort plugInPort;
private AboutDialog aboutDialog;
@Override
public void connect(IPlugInPort plugInPort) {
this.plugInPort = plugInPort;
plugInPort.injectMenuAction(new AboutAction(), HELP_TITLE);
}
@Override
public EnumSet<EventType> getSubscribedEventTypes() {
return null;
}
@Override
public void processMessage(EventType eventType, Object... params) {
}
private AboutDialog getAboutDialog() {
if (aboutDialog == null) {
aboutDialog = DialogFactory.getInstance().createAboutDialog("DIY Layout Creator 4",
IconLoader.BlackBoard.getIcon(),
plugInPort.getCurrentVersionNumber().toString(), "Bane Stojkovic",
"diy-fever.com", "bancika@gmail.com", "");
}
return aboutDialog;
}
class AboutAction extends AbstractAction {
private static final long serialVersionUID = 1L;
public AboutAction() {
super();
putValue(AbstractAction.NAME, "About");
putValue(AbstractAction.SMALL_ICON, IconLoader.About.getIcon());
}
@Override
public void actionPerformed(ActionEvent e) {
getAboutDialog().setVisible(true);
}
}
}
@@ -0,0 +1,155 @@
package org.diylc.plugins.online;
import java.awt.event.ActionEvent;
import java.util.EnumSet;
import javax.swing.AbstractAction;
import javax.swing.SwingWorker;
import org.diylc.common.EventType;
import org.diylc.common.IPlugIn;
import org.diylc.common.IPlugInPort;
import org.diylc.gui.DialogFactory;
import org.diylc.images.IconLoader;
import org.diylc.plugins.online.presenter.LibraryPresenter;
import org.diylc.plugins.online.view.LoginDialog;
import org.diylc.plugins.online.view.NewUserDialog;
import org.diylc.plugins.online.view.UploadDialog;
import com.diyfever.gui.ProgressDialog;
public class OnlineManager implements IPlugIn {
private static final String ONLINE_TITLE = "Online";
private IPlugInPort plugInPort;
private LibraryPresenter libraryPresenter;
@Override
public void connect(IPlugInPort plugInPort) {
this.plugInPort = plugInPort;
this.libraryPresenter = new LibraryPresenter();
initialize();
plugInPort.injectMenuAction(new LibraryAction(), ONLINE_TITLE);
plugInPort.injectMenuAction(null, ONLINE_TITLE);
plugInPort.injectMenuAction(new LoginAction(), ONLINE_TITLE);
plugInPort.injectMenuAction(new CreateAccountAction(), ONLINE_TITLE);
plugInPort.injectMenuAction(null, ONLINE_TITLE);
plugInPort.injectMenuAction(new UploadAction(), ONLINE_TITLE);
plugInPort.injectMenuAction(new ManageProjectsAction(), ONLINE_TITLE);
}
private void initialize() {
SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
@Override
protected Void doInBackground() throws Exception {
libraryPresenter.connectDb();
return null;
}
@Override
protected void done() {
if (libraryPresenter.isLoggedIn()) {
}
}
};
worker.execute();
}
@Override
public EnumSet<EventType> getSubscribedEventTypes() {
return null;
}
@Override
public void processMessage(EventType eventType, Object... params) {
}
class LibraryAction extends AbstractAction {
private static final long serialVersionUID = 1L;
public LibraryAction() {
super();
putValue(AbstractAction.NAME, "Browse Library");
putValue(AbstractAction.SMALL_ICON, IconLoader.Chest.getIcon());
}
@Override
public void actionPerformed(ActionEvent e) {
}
}
class LoginAction extends AbstractAction {
private static final long serialVersionUID = 1L;
public LoginAction() {
super();
putValue(AbstractAction.NAME, "Log in");
putValue(AbstractAction.SMALL_ICON, IconLoader.IdCard.getIcon());
}
@Override
public void actionPerformed(ActionEvent e) {
LoginDialog dialog = DialogFactory.getInstance().createLoginDialog();
dialog.setVisible(true);
}
}
class CreateAccountAction extends AbstractAction {
private static final long serialVersionUID = 1L;
public CreateAccountAction() {
super();
putValue(AbstractAction.NAME, "Create New Account");
putValue(AbstractAction.SMALL_ICON, IconLoader.IdCardAdd.getIcon());
}
@Override
public void actionPerformed(ActionEvent e) {
NewUserDialog dialog = DialogFactory.getInstance().createNewUserDialog();
dialog.setVisible(true);
}
}
class UploadAction extends AbstractAction {
private static final long serialVersionUID = 1L;
public UploadAction() {
super();
putValue(AbstractAction.NAME, "Upload Project");
putValue(AbstractAction.SMALL_ICON, IconLoader.Upload.getIcon());
}
@Override
public void actionPerformed(ActionEvent e) {
UploadDialog dialog = DialogFactory.getInstance().createUploadDialog();
dialog.setVisible(true);
}
}
class ManageProjectsAction extends AbstractAction {
private static final long serialVersionUID = 1L;
public ManageProjectsAction() {
super();
putValue(AbstractAction.NAME, "Manage Projects");
putValue(AbstractAction.SMALL_ICON, IconLoader.Wrench.getIcon());
}
@Override
public void actionPerformed(ActionEvent e) {
ProgressDialog dialog = DialogFactory.getInstance().createProgressDialog("Test",
new String[] {}, "Some text", false);
dialog.setVisible(true);
}
}
}
@@ -0,0 +1,28 @@
package org.diylc.plugins.online;
import org.apache.log4j.BasicConfigurator;
import org.diylc.plugins.online.presenter.LibraryPresenter;
public class Test {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
BasicConfigurator.configure();
LibraryPresenter pres = new LibraryPresenter();
// pres.createUser("bancika", "pwd", "bancika@gmail.com");
System.out.println(pres.fetchCategories());
pres.login("bancika", "pwd");
int id = pres.fetchMyProjectRows().get(0).getId();
// InputStream stream = pres.downloadProjectContent(id);
// byte[] buf = new byte[100];
// int len = stream.read(buf);
System.out.println(pres.downloadProjectContent(id));
// System.out.println(pres.hashPassword("bancikabancikabancikabancikabancika"));
pres.dispose();
}
}
@@ -0,0 +1,136 @@
package org.diylc.plugins.online.model;
import java.awt.event.ActionEvent;
import java.io.Serializable;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JOptionPane;
public class ProjectEntity implements Serializable {
private static final long serialVersionUID = 1L;
private int id;
private String name;
private String description;
private String owner;
private String category;
public ProjectEntity() {
super();
}
public ProjectEntity(int id, String name, String description, String owner, String category) {
super();
this.id = id;
this.name = name;
this.description = description;
this.owner = owner;
this.category = category;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getOwner() {
return owner;
}
public void setOwner(String owner) {
this.owner = owner;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public Action getDownload() {
Action a = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, name);
}
};
a.putValue(AbstractAction.NAME, "Download");
return a;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((category == null) ? 0 : category.hashCode());
result = prime * result + ((description == null) ? 0 : description.hashCode());
result = prime * result + id;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((owner == null) ? 0 : owner.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ProjectEntity other = (ProjectEntity) obj;
if (category == null) {
if (other.category != null)
return false;
} else if (!category.equals(other.category))
return false;
if (description == null) {
if (other.description != null)
return false;
} else if (!description.equals(other.description))
return false;
if (id != other.id)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (owner == null) {
if (other.owner != null)
return false;
} else if (!owner.equals(other.owner))
return false;
return true;
}
@Override
public String toString() {
return name;
}
}
@@ -0,0 +1,7 @@
package org.diylc.plugins.online.presenter;
public class AlreadyExistsException extends Exception {
private static final long serialVersionUID = 1L;
}
@@ -0,0 +1,177 @@
package org.diylc.plugins.online.presenter;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.diylc.plugins.online.model.ProjectEntity;
public class LibraryPresenter {
private final static Logger LOG = Logger.getLogger(LibraryPresenter.class);
private static final String DB_HOST = "diy-fever.com";
private static final String DB_PORT = "3306";
private static final String DB_USER = "diylc-app";
private static final String DB_PASS = "zuf7RuS8";
private static final String CATEGORY_SQL = "SELECT * FROM diylc.category WHERE 1=1";
private static final String USER_SQL = "SELECT * FROM diylc.user WHERE name = \"%s\"";
private static final String CREATE_USER_SQL = "INSERT INTO diylc.user (name, password, email) VALUES (\"%s\", \"%s\", \"%s\")";
private static final String MY_PROJECTS_SQL = "SELECT project_id, name, category_id, description FROM diylc.project WHERE owner_user_id = %s";
private static final String PROJECT_SQL = "SELECT content FROM diylc.project WHERE project_id = %s";
private static final String UPLOAD_PROJECT_SQL = "INSERT INTO diylc.project (name, description, content, category_id, owner_user_id) VALUES (\"%s\", \"%s\", \"%s\", %s, %s)";
private static final String UPDATE_PROJECT_SQL = "UPDATE diylc.project SET name = \"%s\", description = \"%s\", content = \"%s\", category_id = %s WHERE project_id = %s";
private MySqlDBManager dbManager;
private MessageDigest messageDigest;
private Integer currentUserId;
public LibraryPresenter() {
dbManager = new MySqlDBManager(DB_HOST, DB_PORT, DB_USER, DB_PASS);
try {
messageDigest = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
LOG.error("Could not initialize MD5, algorithm not found.");
}
}
public boolean connectDb() {
try {
dbManager.connectDB();
return true;
} catch (Exception e) {
LOG.error("Could not connect to the database: " + e.getMessage());
return false;
}
}
public void createUser(String userName, String password, String email) throws SQLException,
NotConnectedException, AlreadyExistsException {
LOG.info("Creating user: " + userName);
if (dbManager.isConnected()) {
ResultSet resultSet = dbManager.getResultSet(String.format(USER_SQL, userName));
if (resultSet.next()) {
throw new AlreadyExistsException();
}
dbManager.updateDB(String.format(CREATE_USER_SQL, userName, hashPassword(password),
email));
resultSet = dbManager.getResultSet(String.format(USER_SQL, userName));
if (resultSet.next()) {
LOG.info("Logged in as \"" + userName + "\"");
currentUserId = resultSet.getInt("user_id");
}
} else {
LOG.error("Not connected");
throw new NotConnectedException();
}
}
public boolean login(String userName, String password) throws SQLException,
NotConnectedException {
LOG.info("Logging in as: " + userName);
if (dbManager.isConnected()) {
ResultSet resultSet = dbManager.getResultSet(String.format(USER_SQL, userName));
if (resultSet.next()) {
String dbPassword = resultSet.getString("password");
String hashPassword = hashPassword(password);
if (dbPassword.equals(hashPassword)) {
LOG.info("Logged in as \"" + userName + "\"");
currentUserId = resultSet.getInt("user_id");
} else {
LOG.info("User name and password do not match.");
}
}
return false;
} else {
LOG.error("Not connected");
throw new NotConnectedException();
}
}
public Map<Integer, String> fetchCategories() throws SQLException, NotConnectedException {
LOG.info("Fetching categories");
if (dbManager.isConnected()) {
Map<Integer, String> categories = new HashMap<Integer, String>();
ResultSet resultSet = dbManager.getResultSet(CATEGORY_SQL);
while (resultSet.next()) {
categories.put(resultSet.getInt("category_id"), resultSet.getString("name"));
}
return categories;
} else {
LOG.error("Not connected");
throw new NotConnectedException();
}
}
public List<ProjectEntity> fetchMyProjectRows() throws NotLoggedInException,
NotConnectedException, SQLException {
if (dbManager.isConnected()) {
if (isLoggedIn()) {
Map<Integer, String> categories = fetchCategories();
List<ProjectEntity> projects = new ArrayList<ProjectEntity>();
ResultSet resultSet = dbManager.getResultSet(String.format(MY_PROJECTS_SQL,
currentUserId));
while (resultSet.next()) {
projects.add(new ProjectEntity(resultSet.getInt("project_id"), resultSet
.getString("name"), resultSet.getString("description"), "", categories
.get(resultSet.getInt("category_id"))));
}
return projects;
} else {
LOG.error("Not logged in");
throw new NotLoggedInException();
}
} else {
LOG.error("Not connected");
throw new NotConnectedException();
}
}
public String downloadProjectContent(int projectId) throws NotConnectedException,
NotExistsException, SQLException {
if (dbManager.isConnected()) {
ResultSet resultSet = dbManager.getResultSet(String.format(PROJECT_SQL, projectId));
if (resultSet.next()) {
return resultSet.getString("content");
}
throw new NotExistsException("Project with id = " + projectId + " does not exist.");
} else {
LOG.error("Not connected");
throw new NotConnectedException();
}
}
public List<ProjectEntity> fetchProjectRows(String searchCriteria) {
return null;
}
public boolean isLoggedIn() {
return currentUserId != null;
}
public String hashPassword(String password) {
messageDigest.reset();
byte[] bytes = messageDigest.digest(password.getBytes());
String md5 = "";
for (byte b : bytes) {
String str = Integer.toHexString(b);
if (str.length() == 1) {
str = "0" + str;
}
md5 += str.substring(str.length() - 2);
}
return md5;
}
public void dispose() {
dbManager.closeConnection();
}
}
@@ -0,0 +1,86 @@
package org.diylc.plugins.online.presenter;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.log4j.Logger;
public class MySqlDBManager {
private final static Logger LOG = Logger.getLogger(MySqlDBManager.class);
protected Connection connection;
protected Statement statement;
protected ResultSet resultSet;
protected String url;
protected String user;
protected String pass;
protected boolean connected;
public MySqlDBManager(String url, String user, String pass) {
this.url = url;
this.user = user;
this.pass = pass;
this.connected = false;
}
public MySqlDBManager(String host, String port, String userName, String password) {
this(String.format("jdbc:mysql://%s%s", host, port.trim().equals("") ? "" : (":" + port)),
userName, password);
}
public void connectDB() throws Exception {
if (!connected) {
Driver driver = (Driver) Class.forName("com.mysql.jdbc.Driver").newInstance();
DriverManager.registerDriver(driver);
String finalUrl = String.format("%s?user=%s&password=%s", url, user, pass);
LOG.info("Trying to connect to: " + url);
connection = DriverManager.getConnection(finalUrl);
statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
connected = true;
}
}
public boolean isConnected() {
return connected;
}
public void closeConnection() {
LOG.info("Closing connection.");
try {
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
connected = false;
} catch (SQLException e) {
e.printStackTrace();
}
}
public ResultSet getResultSet(String query) throws SQLException {
LOG.info("Executing query: " + query);
resultSet = statement.executeQuery(query);
return resultSet;
}
public Connection getConnection() {
return connection;
}
public int updateDB(String query) throws SQLException {
LOG.info("Executing query: " + query);
statement.execute(query);
return statement.getUpdateCount();
}
}
@@ -0,0 +1,7 @@
package org.diylc.plugins.online.presenter;
public class NotConnectedException extends Exception {
private static final long serialVersionUID = 1L;
}
@@ -0,0 +1,10 @@
package org.diylc.plugins.online.presenter;
public class NotExistsException extends Exception {
private static final long serialVersionUID = 1L;
public NotExistsException(String message) {
super(message);
}
}
@@ -0,0 +1,7 @@
package org.diylc.plugins.online.presenter;
public class NotLoggedInException extends Exception {
private static final long serialVersionUID = 1L;
}
@@ -0,0 +1,12 @@
package org.diylc.plugins.online.view;
import javax.swing.JFrame;
public class LibraryFrame extends JFrame {
private static final long serialVersionUID = 1L;
public LibraryFrame() {
super("Online Library");
}
}
@@ -0,0 +1,135 @@
package org.diylc.plugins.online.view;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import com.diyfever.gui.ButtonDialog;
public class LoginDialog extends ButtonDialog {
private static final long serialVersionUID = 1L;
private JPanel mainPanel;
private JTextField userNameField;
private JPasswordField passwordField;
private String userName;
private String password;
public LoginDialog(JFrame owner) {
super(owner, "Login", new String[] { OK, CANCEL });
setMinimumSize(new Dimension(240, 32));
layoutGui();
refreshState();
}
public String getUserName() {
return userName;
}
public String getPassword() {
return password;
}
@Override
protected JComponent getMainComponent() {
if (mainPanel == null) {
mainPanel = new JPanel(new GridBagLayout());
mainPanel.setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8));
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.LINE_START;
gbc.fill = GridBagConstraints.NONE;
gbc.insets = new Insets(2, 2, 2, 2);
gbc.gridx = 0;
gbc.gridy = 0;
mainPanel.add(new JLabel("User Name:"), gbc);
gbc.gridy = 1;
mainPanel.add(new JLabel("Password:"), gbc);
gbc.gridx = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weightx = 1;
gbc.gridy = 0;
mainPanel.add(getUserNameField(), gbc);
gbc.gridy = 1;
mainPanel.add(getPasswordField(), gbc);
}
return mainPanel;
}
private void refreshState() {
this.userName = getUserNameField().getText();
this.password = new String(getPasswordField().getPassword());
JButton okButton = getButton(OK);
okButton.setEnabled((this.userName.length() > 0) && (this.password.length() > 0));
}
private JTextField getUserNameField() {
if (userNameField == null) {
userNameField = new JTextField();
userNameField.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent e) {
refreshState();
}
@Override
public void insertUpdate(DocumentEvent e) {
refreshState();
}
@Override
public void changedUpdate(DocumentEvent e) {
refreshState();
}
});
}
return userNameField;
}
private JPasswordField getPasswordField() {
if (passwordField == null) {
passwordField = new JPasswordField();
passwordField.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent e) {
refreshState();
}
@Override
public void insertUpdate(DocumentEvent e) {
refreshState();
}
@Override
public void changedUpdate(DocumentEvent e) {
refreshState();
}
});
}
return passwordField;
}
}
@@ -0,0 +1,210 @@
package org.diylc.plugins.online.view;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import com.diyfever.gui.ButtonDialog;
public class NewUserDialog extends ButtonDialog {
private static final long serialVersionUID = 1L;
private JPanel mainPanel;
private JTextField userNameField;
private JPasswordField passwordField;
private JPasswordField confirmPasswordField;
private JTextField emailField;
private String userName;
private String password;
private String email;
public NewUserDialog(JFrame owner) {
super(owner, "New Account", new String[] { OK, CANCEL });
setMinimumSize(new Dimension(240, 32));
layoutGui();
refreshState();
userNameField.setText(System.getProperty("user.name"));
}
public String getUserName() {
return userName;
}
public String getPassword() {
return password;
}
public String getEmail() {
return email;
}
@Override
protected JComponent getMainComponent() {
if (mainPanel == null) {
mainPanel = new JPanel(new GridBagLayout());
mainPanel.setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8));
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.LINE_START;
gbc.fill = GridBagConstraints.NONE;
gbc.insets = new Insets(2, 2, 2, 2);
gbc.gridx = 0;
gbc.gridy = 0;
mainPanel.add(new JLabel("User Name:"), gbc);
gbc.gridy = 1;
mainPanel.add(new JLabel("Password:"), gbc);
gbc.gridy = 2;
mainPanel.add(new JLabel("Confirm Password:"), gbc);
gbc.gridy = 3;
mainPanel.add(new JLabel("eMail:"), gbc);
gbc.gridx = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weightx = 1;
gbc.gridy = 0;
mainPanel.add(getUserNameField(), gbc);
gbc.gridy = 1;
mainPanel.add(getPasswordField(), gbc);
gbc.gridy = 2;
mainPanel.add(getConfirmPasswordField(), gbc);
gbc.gridy = 3;
mainPanel.add(getEmailField(), gbc);
}
return mainPanel;
}
private void refreshState() {
this.userName = getUserNameField().getText();
String password = new String(getPasswordField().getPassword());
String confirmPassword = new String(getConfirmPasswordField().getPassword());
if (password.equals(confirmPassword)) {
this.password = password;
} else {
this.password = null;
}
this.email = getEmailField().getText();
JButton okButton = getButton(OK);
okButton.setEnabled((this.userName.length() > 0) && (this.password != null)
&& (this.password.length() > 0));
}
private JTextField getUserNameField() {
if (userNameField == null) {
userNameField = new JTextField();
userNameField.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent e) {
refreshState();
}
@Override
public void insertUpdate(DocumentEvent e) {
refreshState();
}
@Override
public void changedUpdate(DocumentEvent e) {
refreshState();
}
});
}
return userNameField;
}
private JPasswordField getPasswordField() {
if (passwordField == null) {
passwordField = new JPasswordField();
passwordField.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent e) {
refreshState();
}
@Override
public void insertUpdate(DocumentEvent e) {
refreshState();
}
@Override
public void changedUpdate(DocumentEvent e) {
refreshState();
}
});
}
return passwordField;
}
private JPasswordField getConfirmPasswordField() {
if (confirmPasswordField == null) {
confirmPasswordField = new JPasswordField();
confirmPasswordField.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent e) {
refreshState();
}
@Override
public void insertUpdate(DocumentEvent e) {
refreshState();
}
@Override
public void changedUpdate(DocumentEvent e) {
refreshState();
}
});
}
return confirmPasswordField;
}
private JTextField getEmailField() {
if (emailField == null) {
emailField = new JTextField();
emailField.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent e) {
refreshState();
}
@Override
public void insertUpdate(DocumentEvent e) {
refreshState();
}
@Override
public void changedUpdate(DocumentEvent e) {
refreshState();
}
});
}
return emailField;
}
}
@@ -0,0 +1,105 @@
package org.diylc.plugins.online.view;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.BorderFactory;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import com.diyfever.gui.ButtonDialog;
public class UploadDialog extends ButtonDialog {
private static final long serialVersionUID = 1L;
private static final String BULLET = "&nbsp;&nbsp;&nbsp;&#8226;&nbsp;";
private static final String TERMS_HTML = "<html><b>Terms of Service</b><br><br>"
+ BULLET
+ "Online Library is provided free of charge for DIY Layout Creator users.<br>"
+ BULLET
+ "Only finished and verified projects may be uploaded to the library. Online Library is <b>not</b> a repository for unfinished projects and temprary work.<br>"
+ BULLET
+ "Projects uploaded to the library may be reviewed, modified or deleted by the administrator without notice.<br>"
+ BULLET
+ "Once uploaded, project becomes avaialble to all other users. Anyone may use the project, modify it and upload modified version. When modifying an existing projects credit for the original author must be left.<br>"
+ BULLET
+ "You can <b>not</b> use Online Library to advertise products or services.<br>"
+ BULLET
+ "Users that do not follow these terms may be banned from the server, with or without notice.<br>"
+ BULLET + "Administrator is not responsible for library contents.<br>" + "</html>";
private JPanel mainPanel;
private JLabel termsLabel;
private JCheckBox agreeBox;
public UploadDialog(JFrame owner) {
super(owner, "Upload", new String[] { OK, CANCEL });
layoutGui();
refreshState();
}
@Override
protected JComponent getMainComponent() {
if (mainPanel == null) {
mainPanel = new JPanel(new GridBagLayout());
mainPanel.setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8));
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.LINE_START;
gbc.fill = GridBagConstraints.BOTH;
gbc.weightx = 1;
gbc.weighty = 1;
gbc.insets = new Insets(2, 2, 2, 2);
gbc.gridx = 0;
gbc.gridy = 0;
mainPanel.add(getTermsLabel(), gbc);
gbc.gridy = 1;
gbc.anchor = GridBagConstraints.CENTER;
gbc.fill = GridBagConstraints.NONE;
gbc.weightx = 0;
gbc.weighty = 0;
mainPanel.add(getAgreeBox(), gbc);
}
return mainPanel;
}
private void refreshState() {
getButton(OK).setEnabled(getAgreeBox().isSelected());
}
private JCheckBox getAgreeBox() {
if (agreeBox == null) {
agreeBox = new JCheckBox("I agree to these terms");
agreeBox.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
refreshState();
}
});
}
return agreeBox;
}
private JLabel getTermsLabel() {
if (termsLabel == null) {
termsLabel = new JLabel();
termsLabel.setOpaque(true);
termsLabel.setBackground(UIManager.getColor("ToolTip.background"));
termsLabel.setBorder(BorderFactory.createCompoundBorder(BorderFactory
.createEtchedBorder(), BorderFactory.createEmptyBorder(2, 2, 2, 2)));
termsLabel.setText(TERMS_HTML);
}
return termsLabel;
}
}
@@ -0,0 +1,213 @@
package org.diylc.plugins.statusbar;
import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;
import java.util.Map;
import javax.swing.BorderFactory;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import org.diylc.common.BadPositionException;
import org.diylc.common.ControlPointWrapper;
import org.diylc.common.EventType;
import org.diylc.common.IPlugIn;
import org.diylc.common.IPlugInPort;
import org.diylc.model.IComponentInstance;
import org.diylc.model.IComponentType;
import org.diylc.presenter.ComponentProcessor;
import com.diyfever.gui.MemoryBar;
import com.diyfever.gui.miscutils.PercentageListCellRenderer;
import com.diyfever.gui.update.UpdateLabel;
public class StatusBar extends JPanel implements IPlugIn {
private static final long serialVersionUID = 1L;
private JComboBox zoomBox;
private UpdateLabel updateLabel;
private MemoryBar memoryPanel;
private JLabel statusLabel;
private IPlugInPort plugInPort;
// State variables
private IComponentType componentSlot;
private List<IComponentInstance> componentsUnderCursor;
public StatusBar() {
super();
// setLayout(new FlowLayout(FlowLayout.TRAILING));
setLayout(new GridBagLayout());
}
private JComboBox getZoomBox() {
if (zoomBox == null) {
zoomBox = new JComboBox(new Double[] { 0.25d, 0.5d, 0.75d, 1d, 1.5d, 2d });
zoomBox.setSelectedItem(1d);
zoomBox.setFocusable(false);
zoomBox.setRenderer(new PercentageListCellRenderer());
zoomBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
plugInPort.setZoomLevel((Double) zoomBox.getSelectedItem());
}
});
}
return zoomBox;
}
private UpdateLabel getUpdateLabel() {
if (updateLabel == null) {
updateLabel = new UpdateLabel(plugInPort.getCurrentVersionNumber(),
"http://www.diy-fever.com/update.xml");
// updateLabel.setBorder(BorderFactory.createCompoundBorder(
// BorderFactory.createEtchedBorder(), BorderFactory
// .createEmptyBorder(2, 4, 2, 4)));
updateLabel.setBorder(BorderFactory.createEmptyBorder(2, 4, 2, 4));
}
return updateLabel;
}
private MemoryBar getMemoryPanel() {
if (memoryPanel == null) {
memoryPanel = new MemoryBar(true);
}
return memoryPanel;
}
private JLabel getStatusLabel() {
if (statusLabel == null) {
statusLabel = new JLabel();
statusLabel.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 0));
}
return statusLabel;
}
private void layoutComponents() {
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weightx = 1;
add(getStatusLabel(), gbc);
JPanel zoomPanel = new JPanel(new BorderLayout());
zoomPanel.add(new JLabel("Zoom: "), BorderLayout.WEST);
zoomPanel.add(getZoomBox(), BorderLayout.CENTER);
// zoomPanel.setBorder(BorderFactory.createCompoundBorder(BorderFactory
// .createEtchedBorder(), BorderFactory.createEmptyBorder(2, 4, 2,
// 4)));
zoomPanel.setBorder(BorderFactory.createEmptyBorder(2, 4, 2, 4));
gbc.gridx = 1;
gbc.fill = GridBagConstraints.BOTH;
gbc.weightx = 0;
add(zoomPanel, gbc);
gbc.gridx = 2;
add(getUpdateLabel(), gbc);
gbc.gridx = 3;
gbc.fill = GridBagConstraints.NONE;
add(getMemoryPanel(), gbc);
gbc.gridx = 4;
add(new JPanel(), gbc);
}
// IPlugIn
@Override
public void connect(IPlugInPort plugInPort) {
this.plugInPort = plugInPort;
layoutComponents();
try {
plugInPort.injectGUIComponent(this, SwingUtilities.BOTTOM);
} catch (BadPositionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public EnumSet<EventType> getSubscribedEventTypes() {
return EnumSet.of(EventType.ZOOM_CHANGED, EventType.SLOT_CHANGED,
EventType.AVAILABLE_CTRL_POINTS_CHANGED);
}
@SuppressWarnings("unchecked")
@Override
public void processMessage(EventType eventType, Object... params) {
switch (eventType) {
case ZOOM_CHANGED:
if (!params[0].equals(getZoomBox().getSelectedItem())) {
getZoomBox().setSelectedItem(params[0]);
}
break;
case SLOT_CHANGED:
componentSlot = (IComponentType) params[0];
refreshStatusText();
break;
case AVAILABLE_CTRL_POINTS_CHANGED:
componentsUnderCursor = new ArrayList<IComponentInstance>(
((Map<IComponentInstance, ControlPointWrapper>) params[0]).keySet());
refreshStatusText();
break;
}
}
private void refreshStatusText() {
if (componentSlot == null) {
if ((componentsUnderCursor == null) || (componentsUnderCursor.isEmpty())) {
getStatusLabel().setText("");
} else {
// String formattedNames = "";
// int n = 1;
// for (IComponentInstance component : componentsUnderCursor) {
// if (n > 1) {
// formattedNames += ", ";
// }
// formattedNames +=
// ComponentProcessor.getInstance().extractBomName(component);//
// +
// // " (<b><font color=\"blue\">"
// // +
// // n++
// // +
// // "</font></b>)";
// }
if (componentsUnderCursor.size() == 1) {
getStatusLabel().setText(
"Drag \""
+ ComponentProcessor.getInstance().extractBomName(
componentsUnderCursor.get(0)) + "\"");
} else {
getStatusLabel().setText(
"Hold CTRL key to drag all "
+ componentsUnderCursor.size()
+ " components under the cursor or drag only \""
+ ComponentProcessor.getInstance().extractBomName(
componentsUnderCursor.get(0)) + "\"");
}
}
} else {
getStatusLabel().setText(
"Click on the canvas to create a new " + componentSlot.getName()
+ " or press Esc to cancel");
}
}
}
@@ -0,0 +1,68 @@
package org.diylc.plugins.toolbox;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragSource;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import org.diylc.common.IPlugInPort;
import org.diylc.model.IComponentType;
/**
* {@link JButton} that displays component type icon and instantiates the
* component when clicked.
*
* @author Branislav Stojkovic
*/
class ComponentButton extends JButton {
private static final long serialVersionUID = 1L;
private IPlugInPort plugInPort;
private IComponentType componentType;
public ComponentButton(final IPlugInPort plugInPort, final IComponentType componentType) {
super(componentType.getIcon());
this.plugInPort = plugInPort;
this.componentType = componentType;
setToolTipText("<html><b>" + componentType.getName() + "</b><br><br>"
+ componentType.getDescription() + "</html>");
// initializeDnD();
addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// plugInPort.setCursorIcon(componentType.getIcon());
plugInPort.setNewComponentSlot(componentType);
// try {
// plugInPort.instantiateComponent(componentType
// .getComponentInstanceClass(), null);
// } catch (Exception e1) {
// e1.printStackTrace();
// }
}
});
// addKeyListener(new KeyAdapter() {
//
// @Override
// public void keyPressed(KeyEvent e) {
// if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
// plugInPort.setNewComponentSlot(null);
// }
// }
// });
}
private void initializeDnD() {
// Initialize drag source recognizer.
DragSource.getDefaultDragSource().createDefaultDragGestureRecognizer(
this,
DnDConstants.ACTION_MOVE,
new ToolboxGestureListener(plugInPort, componentType.getComponentInstanceClass()
.getName()));
}
}
@@ -0,0 +1,38 @@
package org.diylc.plugins.toolbox;
import java.awt.Container;
import java.util.List;
import java.util.Map;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JTabbedPane;
import org.diylc.common.IPlugInPort;
import org.diylc.model.IComponentType;
class ComponentTabbedPane extends JTabbedPane {
private static final long serialVersionUID = 1L;
private final IPlugInPort plugInPort;
public ComponentTabbedPane(IPlugInPort plugInPort) {
super();
this.plugInPort = plugInPort;
Map<String, List<IComponentType>> componentTypes = plugInPort.getComponentTypes();
for (Map.Entry<String, List<IComponentType>> entry : componentTypes.entrySet()) {
addTab(entry.getKey(), createComponentPanel(entry.getValue()));
}
}
private Container createComponentPanel(List<IComponentType> componentTypes) {
Container componentPanel = new Container();
componentPanel.setLayout(new BoxLayout(componentPanel, BoxLayout.X_AXIS));
for (IComponentType componentType : componentTypes) {
JButton button = new ComponentButton(plugInPort, componentType);
componentPanel.add(button);
}
return componentPanel;
}
}
@@ -0,0 +1,36 @@
package org.diylc.plugins.toolbox;
import java.util.EnumSet;
import javax.swing.SwingConstants;
import org.diylc.common.BadPositionException;
import org.diylc.common.EventType;
import org.diylc.common.IPlugIn;
import org.diylc.common.IPlugInPort;
public class ToolBox implements IPlugIn {
@Override
public void connect(IPlugInPort plugInPort) {
try {
plugInPort.injectGUIComponent(new ComponentTabbedPane(plugInPort), SwingConstants.TOP);
} catch (BadPositionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public EnumSet<EventType> getSubscribedEventTypes() {
// TODO Auto-generated method stub
return null;
}
@Override
public void processMessage(EventType eventType, Object... params) {
// TODO Auto-generated method stub
}
}
@@ -0,0 +1,33 @@
package org.diylc.plugins.toolbox;
import java.awt.Cursor;
import java.awt.datatransfer.StringSelection;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.DragGestureListener;
import org.diylc.common.IPlugInPort;
/**
* {@link DragGestureListener} for {@link CanvasPanel}.
*
* @author Branislav Stojkovic
*/
class ToolboxGestureListener implements DragGestureListener {
private IPlugInPort presenter;
private String className;
public ToolboxGestureListener(IPlugInPort presenter, String className) {
super();
this.presenter = presenter;
this.className = className;
}
@Override
public void dragGestureRecognized(DragGestureEvent dge) {
presenter.dragStarted(dge.getDragOrigin());
dge.startDrag(Cursor.getDefaultCursor(), new StringSelection(className),
new ToolboxSourceListener(presenter));
}
}
@@ -0,0 +1,47 @@
package org.diylc.plugins.toolbox;
import java.awt.dnd.DragSourceDragEvent;
import java.awt.dnd.DragSourceDropEvent;
import java.awt.dnd.DragSourceEvent;
import java.awt.dnd.DragSourceListener;
import javax.swing.JComponent;
import org.diylc.common.IPlugInPort;
/**
* {@link DragSourceListener} for {@link CanvasPanel}.
*
* @author Branislav Stojkovic
*/
class ToolboxSourceListener implements DragSourceListener {
private IPlugInPort presenter;
public ToolboxSourceListener(IPlugInPort presenter) {
super();
this.presenter = presenter;
}
@Override
public void dragDropEnd(DragSourceDropEvent dsde) {
((JComponent) dsde.getDragSourceContext().getComponent()).revalidate();
}
@Override
public void dragEnter(DragSourceDragEvent dsde) {
}
@Override
public void dragExit(DragSourceEvent dse) {
}
@Override
public void dragOver(DragSourceDragEvent dsde) {
}
@Override
public void dropActionChanged(DragSourceDragEvent dsde) {
}
}