Skip to content
Snippets Groups Projects
Commit 86a347d3 authored by Stéphane  DALLONGEVILLE's avatar Stéphane DALLONGEVILLE
Browse files

fixed possible NPE

parent fdfb895e
No related branches found
No related tags found
No related merge requests found
......@@ -30,20 +30,20 @@ import plugins.adufour.vars.lang.Var;
@SuppressWarnings("serial")
public class LoopPanel extends WorkFlowPanel
{
private final Loop loop;
private final JPanel innerLoopPanel;
private final Loop loop;
private final JPanel innerLoopPanel;
/**
* Option used in loops
*/
protected final JCheckBox menuStopOnFirstError = new JCheckBox("Stop on first error");
public LoopPanel(WorkFlowContainer wfPane, BlockDescriptor blockInfo)
{
super(wfPane, blockInfo);
this.loop = (Loop) blockDesc.getBlock();
// create a special panel to receive the loop variables
innerLoopPanel = new JPanel(new GridBagLayout())
{
......@@ -51,7 +51,7 @@ public class LoopPanel extends WorkFlowPanel
public void paintChildren(Graphics g)
{
Graphics2D g2 = (Graphics2D) g;
Point2D p1 = gradient.getPoint1();
p1.setLocation(p1.getX() + 1, p1.getY() - 30);
g2.setPaint(new GradientPaint(p1, gradient.getColor1(), gradient.getPoint2(), gradient.getColor2()));
......@@ -60,17 +60,17 @@ public class LoopPanel extends WorkFlowPanel
g2.setColor(Color.gray);
g2.drawLine(15, getHeight() - 1, getWidth() - 6, getHeight() - 1);
g2.drawLine(getWidth() - 6, 0, getWidth() - 6, getHeight());
super.paintChildren(g2);
}
};
innerLoopPanel.setOpaque(false);
innerLoopPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 2, 2));
menuStopOnFirstError.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e)
{
......@@ -78,28 +78,30 @@ public class LoopPanel extends WorkFlowPanel
{
loop.stopOnFirstError.setValue(menuStopOnFirstError.isSelected());
}
else super.actionPerformed(e);
else
super.actionPerformed(e);
}
@Override
protected void drawMenu()
{
super.drawMenu();
// add an extra option to close the work flow while preserving its contents
super.menu.add(menuStopOnFirstError);
}
@Override
protected void drawContent()
{
innerLoopPanel.removeAll();
int nextRow = 0;
// add batch elements (if any) to the loop panel
if (blockDesc.getBlock() instanceof Batch) nextRow = drawBatchVariables(nextRow);
if (blockDesc.getBlock() instanceof Batch)
nextRow = drawBatchVariables(nextRow);
// add other loop variables
for (Var<?> loopVariable : loop.getLoopVariables())
{
......@@ -107,40 +109,44 @@ public class LoopPanel extends WorkFlowPanel
if (blockDesc.getBlock() instanceof Batch)
{
Batch batch = (Batch) blockDesc.getBlock();
if (loopVariable == batch.getBatchSource() || loopVariable == batch.getBatchElement()) continue;
if (loopVariable == batch.getBatchSource() || loopVariable == batch.getBatchElement())
continue;
}
nextRow = drawLoopVariable(nextRow, loopVariable);
}
// add the loop panel to the main container
GridBagConstraints gbc_loop = new GridBagConstraints();
gbc_loop.anchor = GridBagConstraints.NORTHWEST;
jPanelContent.add(innerLoopPanel, gbc_loop);
nextRow = drawExposedLinks(nextRow);
drawInnerWorkFlowContainer(nextRow + 1);
}
private int drawBatchVariables(int row)
{
Batch batch = (Batch) blockDesc.getBlock();
// Batch variables (source and element) are drawn in a peculiar way:
// [source drop zone] [source label] [source editor] [element drag zone]
// create drop zone and editor for the batch source
Var<?> batchSource = batch.getBatchSource();
if (!varDropZones.containsKey(batchSource)) varDropZones.put(batchSource, createVarDropZone(batchSource, true, DragDropZone.LINK_RIGHT));
if (!varEditors.containsKey(batchSource)) varEditors.put(batchSource, createVarEditor(batchSource));
if (!varDropZones.containsKey(batchSource))
varDropZones.put(batchSource, createVarDropZone(batchSource, true, DragDropZone.LINK_RIGHT));
if (!varEditors.containsKey(batchSource))
varEditors.put(batchSource, createVarEditor(batchSource));
// create drag zone for the batch element
Var<?> batchElement = batch.getBatchElement();
if (!varDragZones.containsKey(batchElement)) varDragZones.put(batchElement, createVarDragZone(batchElement, false));
if (!varDragZones.containsKey(batchElement))
varDragZones.put(batchElement, createVarDragZone(batchElement, false));
// Draw the first row in a particular way (source => elements)
GridBagConstraints gbc_dropZone = new GridBagConstraints();
gbc_dropZone.anchor = GridBagConstraints.WEST;
gbc_dropZone.fill = GridBagConstraints.NONE;
......@@ -148,7 +154,7 @@ public class LoopPanel extends WorkFlowPanel
gbc_dropZone.gridx = 0;
gbc_dropZone.gridy = row;
innerLoopPanel.add(varDropZones.get(batchSource), gbc_dropZone);
GridBagConstraints gbc_inputName = new GridBagConstraints();
gbc_inputName.anchor = GridBagConstraints.CENTER;
gbc_inputName.fill = GridBagConstraints.HORIZONTAL;
......@@ -161,7 +167,7 @@ public class LoopPanel extends WorkFlowPanel
inputNameDim.height = 20;
inputName.setPreferredSize(inputNameDim);
innerLoopPanel.add(inputName, gbc_inputName);
GridBagConstraints gbc_inputComponent = new GridBagConstraints();
gbc_inputComponent.anchor = GridBagConstraints.CENTER;
gbc_inputComponent.fill = GridBagConstraints.HORIZONTAL;
......@@ -174,7 +180,7 @@ public class LoopPanel extends WorkFlowPanel
inputEditor.setFocusable(false);
inputEditor.setPreferredSize(varEditors.get(batchSource).getPreferredSize());
innerLoopPanel.add(inputEditor, gbc_inputComponent);
GridBagConstraints gbc_dragZone = new GridBagConstraints();
gbc_dragZone.anchor = GridBagConstraints.EAST;
gbc_dragZone.fill = GridBagConstraints.NONE;
......@@ -182,18 +188,21 @@ public class LoopPanel extends WorkFlowPanel
gbc_dragZone.gridx = 3;
gbc_dragZone.gridy = row;
innerLoopPanel.add(varDragZones.get(batchElement), gbc_dragZone);
return row + 1;
}
private int drawLoopVariable(int startRow, Var<?> loopVar)
{
boolean isLoopInput = loop.getBlockDescriptor().inputVars.contains(loopVar);
if (!varDropZones.containsKey(loopVar) && isLoopInput) varDropZones.put(loopVar, createVarDropZone(loopVar, true, DragDropZone.LINK_RIGHT));
if (!varEditors.containsKey(loopVar)) varEditors.put(loopVar, createVarEditor(loopVar));
if (!varDragZones.containsKey(loopVar)) varDragZones.put(loopVar, createVarDragZone(loopVar, true));
if (!varDropZones.containsKey(loopVar) && isLoopInput)
varDropZones.put(loopVar, createVarDropZone(loopVar, true, DragDropZone.LINK_RIGHT));
if (!varEditors.containsKey(loopVar))
varEditors.put(loopVar, createVarEditor(loopVar));
if (!varDragZones.containsKey(loopVar))
varDragZones.put(loopVar, createVarDragZone(loopVar, true));
if (isLoopInput)
{
GridBagConstraints gbc_dropZone = new GridBagConstraints();
......@@ -204,7 +213,7 @@ public class LoopPanel extends WorkFlowPanel
gbc_dropZone.gridy = startRow;
innerLoopPanel.add(loopVar.isEnabled() ? varDropZones.get(loopVar) : new JLabel(" "), gbc_dropZone);
}
GridBagConstraints gbc_inputName = new GridBagConstraints();
gbc_inputName.anchor = GridBagConstraints.CENTER;
gbc_inputName.fill = GridBagConstraints.HORIZONTAL;
......@@ -217,7 +226,7 @@ public class LoopPanel extends WorkFlowPanel
inputNameDim.height = 20;
inputName.setPreferredSize(inputNameDim);
innerLoopPanel.add(inputName, gbc_inputName);
GridBagConstraints gbc_inputComponent = new GridBagConstraints();
gbc_inputComponent.anchor = GridBagConstraints.CENTER;
gbc_inputComponent.fill = GridBagConstraints.HORIZONTAL;
......@@ -231,7 +240,7 @@ public class LoopPanel extends WorkFlowPanel
inputEditor.setEnabled(inputEditor instanceof JLabel || loopVar.getReference() == null);
inputEditor.setPreferredSize(varEditors.get(loopVar).getPreferredSize());
innerLoopPanel.add(inputEditor, gbc_inputComponent);
GridBagConstraints gbc_dragZone = new GridBagConstraints();
gbc_dragZone.anchor = GridBagConstraints.EAST;
gbc_dragZone.fill = GridBagConstraints.NONE;
......@@ -239,63 +248,71 @@ public class LoopPanel extends WorkFlowPanel
gbc_dragZone.gridx = 3;
gbc_dragZone.gridy = startRow;
innerLoopPanel.add(varDragZones.get(loopVar), gbc_dragZone);
return startRow + 1;
}
@Override
public Point getDragZoneLocation(Var<?> output)
{
if (blockDesc.isCollapsed()) return super.getDragZoneLocation(output);
if (blockDesc.isCollapsed())
return super.getDragZoneLocation(output);
if (loop.isLoopVariable(output))
{
DragDropZone dz = varDragZones.get(output);
int x = dz.getLocationOnScreen().x - innerFlowPane.getLocationOnScreen().x;
int y = dz.getLocationOnScreen().y - innerFlowPane.getLocationOnScreen().y;
return new Point(x + dz.getWidth(), y + dz.getHeight() / 2);
if (dz != null)
{
int x = dz.getLocationOnScreen().x - innerFlowPane.getLocationOnScreen().x;
int y = dz.getLocationOnScreen().y - innerFlowPane.getLocationOnScreen().y;
return new Point(x + dz.getWidth(), y + dz.getHeight() / 2);
}
}
return super.getDragZoneLocation(output);
}
@Override
public int getVarPanelWidth()
{
return innerLoopPanel.getWidth();
}
@Override
public int getVarPanelHeight()
{
// return innerLoopPanel.getHeight() + 2;
return getHeight();
}
public void drawPanel()
{
super.drawPanel();
if (blockDesc.isCollapsed())
{
for (Component c : innerLoopPanel.getComponents())
if (c instanceof DragZone<?>) c.setPreferredSize(new Dimension());
if (c instanceof DragZone<?>)
c.setPreferredSize(new Dimension());
innerLoopPanel.setSize(innerLoopPanel.getPreferredSize());
varBox.add(innerLoopPanel);
Dimension di = varBox.getPreferredSize();
varBox.setPreferredSize(new Dimension(di.width, di.height + innerLoopPanel.getHeight()));
setSize(getPreferredSize());
}
else for (Component c : innerLoopPanel.getComponents())
if (c instanceof DragZone<?>) c.setPreferredSize(new Dimension(DragDropZone.DEFAULT_ICON_SIZE, DragDropZone.DEFAULT_ICON_SIZE));
else
for (Component c : innerLoopPanel.getComponents())
if (c instanceof DragZone<?>)
c.setPreferredSize(new Dimension(DragDropZone.DEFAULT_ICON_SIZE, DragDropZone.DEFAULT_ICON_SIZE));
}
@Override
void dispose()
{
menuStopOnFirstError.removeActionListener(this);
super.dispose();
}
}
......@@ -165,14 +165,14 @@ public class WorkFlowPanel extends BlockPanel implements VarVisibilityListener
}
/**
* Draws the drag'n'drop zones representing the exposed variables of the
* inner work flow
*
* @param row
* the row where to start drawing within the
* {@link GridBagLayout}
* @return the last row used in the {@link GridBagLayout}
*/
* Draws the drag'n'drop zones representing the exposed variables of the
* inner work flow
*
* @param row
* the row where to start drawing within the
* {@link GridBagLayout}
* @return the last row used in the {@link GridBagLayout}
*/
protected int drawExposedLinks(final int row)
{
int rowIn = row;
......@@ -196,8 +196,7 @@ public class WorkFlowPanel extends BlockPanel implements VarVisibilityListener
gbc_dropZone.gridx = 0;
gbc_dropZone.gridy = rowIn++;
gbc_dropZone.weighty = 0;
final DragDropZone dropZone = varDropZones.get(input);
jPanelContent.add(dropZone, gbc_dropZone);
jPanelContent.add(varDropZones.get(input), gbc_dropZone);
}
int rowOut = row;
......@@ -310,7 +309,7 @@ public class WorkFlowPanel extends BlockPanel implements VarVisibilityListener
ThreadUtil.invokeLater(new Runnable()
{
@Override
public void run()
public void run()
{
final BlockPanel ownerPanel = innerFlowPane.getBlockPanel(innerBlock);
......@@ -361,9 +360,12 @@ public class WorkFlowPanel extends BlockPanel implements VarVisibilityListener
else
{
final DragDropZone dz = ownerPanel.varDropZones.get(variable);
final Point loc = dz.getLocationOnScreen();
x2 = loc.x - getLocationOnScreen().x;
y2 = loc.y - getLocationOnScreen().y + dz.getHeight() / 2;
if (dz != null)
{
final Point loc = dz.getLocationOnScreen();
x2 = loc.x - getLocationOnScreen().x;
y2 = loc.y - getLocationOnScreen().y + dz.getHeight() / 2;
}
}
}
});
......@@ -378,7 +380,7 @@ public class WorkFlowPanel extends BlockPanel implements VarVisibilityListener
ThreadUtil.invokeLater(new Runnable()
{
@Override
public void run()
public void run()
{
final BlockPanel ownerPanel = innerFlowPane.getBlockPanel(innerBlock);
......@@ -411,9 +413,13 @@ public class WorkFlowPanel extends BlockPanel implements VarVisibilityListener
else
{
final DragDropZone dz = ownerPanel.varDragZones.get(variable);
final Point loc = dz.getLocationOnScreen();
x1 = loc.x - getLocationOnScreen().x + dz.getWidth();
y1 = loc.y - getLocationOnScreen().y + dz.getHeight() / 2;
if (dz != null)
{
final Point loc = dz.getLocationOnScreen();
x1 = loc.x - getLocationOnScreen().x + dz.getWidth();
y1 = loc.y - getLocationOnScreen().y + dz.getHeight() / 2;
}
}
}
......@@ -424,11 +430,15 @@ public class WorkFlowPanel extends BlockPanel implements VarVisibilityListener
return;
final DragDropZone dz = varDragZones.get(variable);
final int y = dz.getLocationOnScreen().y;
final int innerY = getLocationOnScreen().y;
if (dz != null)
{
final int y = dz.getLocationOnScreen().y;
final int innerY = getLocationOnScreen().y;
x2 = dz.getLocation().x;
y2 = y - innerY + dz.getHeight() / 2;
x2 = dz.getLocation().x;
y2 = y - innerY + dz.getHeight() / 2;
}
}
});
}
......@@ -482,7 +492,7 @@ public class WorkFlowPanel extends BlockPanel implements VarVisibilityListener
}
@Override
public void drawPanel()
public void drawPanel()
{
super.drawPanel();
varBox.setVisible(blockDesc.isCollapsed());
......@@ -571,10 +581,15 @@ public class WorkFlowPanel extends BlockPanel implements VarVisibilityListener
varPanel = new JPanel(new GridBagLayout());
varPanel.setOpaque(false);
varPanel.add(varDropZones.get(v), gbc_dropZone);
varPanel.add(new JLabel("\t" + v.getName()), gbc_varName);
final DragDropZone dz = varDropZones.get(v);
blockBox.add(varPanel);
if (dz != null)
{
varPanel.add(dz, gbc_dropZone);
varPanel.add(new JLabel("\t" + v.getName()), gbc_varName);
blockBox.add(varPanel);
}
}
for (final Var<?> v : outputs.get(bd))
......@@ -584,9 +599,15 @@ public class WorkFlowPanel extends BlockPanel implements VarVisibilityListener
varPanel.add(new JLabel("\t\t\t"), gbc_dropZone);
varPanel.add(new JLabel("\t" + v.getName()), gbc_varName);
varPanel.add(varDragZones.get(v), gbc_dragZone);
blockBox.add(varPanel);
final DragDropZone dz = varDragZones.get(v);
if (dz != null)
{
varPanel.add(dz, gbc_dragZone);
blockBox.add(varPanel);
}
}
varBox.add(blockP);
......@@ -596,7 +617,7 @@ public class WorkFlowPanel extends BlockPanel implements VarVisibilityListener
}
@Override
public Dimension getPreferredSize()
public Dimension getPreferredSize()
{
final Dimension d = super.getPreferredSize();
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment