0eba8f553c8ca11d258efbb62b2a44471ff0aa52
[Mograsim.git] / LogicUI / src / era / mi / gui / components / GUIMux.java
1 package era.mi.gui.components;
2
3 import java.util.ArrayList;
4 import java.util.Arrays;
5 import java.util.Collections;
6 import java.util.List;
7
8 import era.mi.logic.components.Mux;
9 import era.mi.logic.timeline.Timeline;
10 import era.mi.logic.wires.Wire.ReadEnd;
11 import era.mi.logic.wires.Wire.ReadWriteEnd;
12 import net.haspamelodica.swt.helper.gcs.GeneralGC;
13 import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
14 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
15
16 public class GUIMux extends Mux implements BasicGUIComponent
17 {
18         private final double height;
19         private final List<ReadEnd> connectedWireEnds;
20         private final List<Point> WireEndConnectionPoints;
21
22         public GUIMux(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd select, ReadEnd... inputs)
23         {
24                 super(timeline, processTime, out, select, inputs);
25
26                 double height = inputs.length * 5;
27                 if (height < 10)
28                         height = 10;
29                 this.height = height;
30
31                 List<ReadEnd> connectedWireEndsModifiable = new ArrayList<>();
32                 List<Point> WireEndConnectionPointsModifiable = new ArrayList<>();
33
34                 connectedWireEndsModifiable.add(out);
35                 WireEndConnectionPointsModifiable.add(new Point(20, 10 + height / 2));
36
37                 connectedWireEndsModifiable.add(select);
38                 WireEndConnectionPointsModifiable.add(new Point(10, 5));
39
40                 {
41                         connectedWireEndsModifiable.addAll(Arrays.asList(inputs));
42                         double inputHeightIncrement = (height + 20) / inputs.length;
43                         double inputHeight = inputHeightIncrement / 2;
44                         for (int i = 0; i < inputs.length; i++, inputHeight += inputHeightIncrement)
45                                 WireEndConnectionPointsModifiable.add(new Point(0, inputHeight));
46                 }
47
48                 this.connectedWireEnds = Collections.unmodifiableList(connectedWireEndsModifiable);
49                 this.WireEndConnectionPoints = Collections.unmodifiableList(WireEndConnectionPointsModifiable);
50         }
51
52         @Override
53         public Rectangle getBounds()
54         {
55                 return new Rectangle(0, 0, 20, height + 20);
56         }
57
58         @Override
59         public void render(GeneralGC gc)
60         {
61                 gc.drawPolygon(new double[] { 0, 0, 20, 10, 20, height + 10, 0, height + 20 });
62         }
63
64         @Override
65         public int getConnectedWireEndsCount()
66         {
67                 return connectedWireEnds.size();
68         }
69
70         @Override
71         public ReadEnd getConnectedWireEnd(int connectionIndex)
72         {
73                 return connectedWireEnds.get(connectionIndex);
74         }
75
76         @Override
77         public Point getWireEndConnectionPoint(int connectionI)
78         {
79                 return WireEndConnectionPoints.get(connectionI);
80         }
81 }