/*
Copyright (C) Paul Falstad and Iain Sharp
This file is part of CircuitJS1.
CircuitJS1 is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
CircuitJS1 is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with CircuitJS1. If not, see <http://www.gnu.org/licenses/>.
*/
package com.lushprojects.circuitjs1.client;
//import java.awt.*;
//import java.awt.event.*;
//import java.util.StringTokenizer;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.Command;
import com.google.gwt.event.dom.client.MouseWheelEvent;
import com.google.gwt.event.dom.client.MouseWheelHandler;
class PotElm extends CircuitElm implements Command, MouseWheelHandler {
double position, maxResistance, resistance1, resistance2;
double current1, current2, current3;
double curcount1, curcount2, curcount3;
Scrollbar slider;
Label label;
String sliderText;
public PotElm(int xx, int yy) {
super(xx, yy);
setup();
maxResistance = 1000;
position = .5;
sliderText = "Resistance";
createSlider();
}
public PotElm(int xa, int ya, int xb, int yb, int f,
StringTokenizer st) {
super(xa, ya, xb, yb, f);
maxResistance = new Double(st.nextToken()).doubleValue();
position = new Double(st.nextToken()).doubleValue();
sliderText = st.nextToken();
while (st.hasMoreTokens())
sliderText += ' ' + st.nextToken();
createSlider();
}
void setup() {
}
int getPostCount() { return 3; }
int getDumpType() { return 174; }
Point getPost(int n) {
return (n == 0) ? point1 : (n == 1) ? point2 : post3;
}
String dump() { return super.dump() + " " + maxResistance + " " +
position + " " + sliderText; }
void createSlider() {
sim.addWidgetToVerticalPanel(label = new Label(sliderText));
label.addStyleName("topSpace");
int value = (int) (position*100);
sim.addWidgetToVerticalPanel(slider = new Scrollbar(Scrollbar.HORIZONTAL, value, 1, 0, 101, this, this));
// sim.verticalPanel.validate();
// slider.addAdjustmentListener(this);
}
public void execute() {
sim.analyzeFlag = true;
setPoints();
}
void delete() {
sim.removeWidgetFromVerticalPanel(label);
sim.removeWidgetFromVerticalPanel(slider);
}
Point post3, corner2, arrowPoint, midpoint, arrow1, arrow2;
Point ps3, ps4;
int bodyLen;
void setPoints() {
super.setPoints();
int offset = 0;
int myLen =0;
if (abs(dx) > abs(dy)) {
myLen = 2 * sim.gridSize * Integer.signum(dx) * ((((Integer)Math.abs(dx))+ 2 * sim.gridSize -1) / (2 * sim.gridSize));
point2.x = point1.x + myLen;
offset = (dx < 0) ? dy : -dy;
point2.y = point1.y;
} else {
myLen = 2 * sim.gridSize * Integer.signum(dy) * ((((Integer)Math.abs(dy))+ 2 * sim.gridSize -1) / (2 * sim.gridSize));
if (dy != 0) {
point2.y = point1.y + myLen;
offset = (dy > 0) ? dx : -dx;
point2.x = point1.x;
}
}
// if (abs(dx) > abs(dy)) {
// dx = Integer.signum(dx) * sim.snapGrid(Math.abs(dx) / 2) * 2;
// point2.x = x2 = point1.x + dx;
// offset = (dx < 0) ? dy : -dy;
// point2.y = point1.y;
// } else {
// dy = Integer.signum(dy) * sim.snapGrid(Math.abs(dy) / 2) * 2;
// if (dy != 0) {
// point2.y = y2 = point1.y + dy;
// offset = (dy > 0) ? dx : -dx;
// point2.x = point1.x;
// }
// }
if (offset == 0)
offset = sim.gridSize;
dn = distance(point1, point2);
int bodyLen = 32;
calcLeads(bodyLen);
position = slider.getValue() * .0099 + .005;
int soff = (int) ((position - .5) * bodyLen);
// int offset2 = offset - sign(offset)*4;
post3 = interpPoint(point1, point2, .5, offset);
corner2 = interpPoint(point1, point2, soff / dn + .5, offset);
arrowPoint = interpPoint(point1, point2, soff / dn + .5, 8 * sign(offset));
midpoint = interpPoint(point1, point2, soff / dn + .5);
arrow1 = new Point();
arrow2 = new Point();
double clen = abs(offset) - 8;
interpPoint2(corner2, arrowPoint, arrow1, arrow2, (clen - 8) / clen, 8);
ps3 = new Point();
ps4 = new Point();
}
void draw(Graphics g) {
int segments = 16;
int i;
int ox = 0;
int hs = sim.euroResistorCheckItem.getState() ? 6 : 8;
double v1 = volts[0];
double v2 = volts[1];
double v3 = volts[2];
setBbox(point1, point2, hs);
draw2Leads(g);
setPowerColor(g, true);
double segf = 1./segments;
int divide = (int) (segments*position);
if (!sim.euroResistorCheckItem.getState()) {
// draw zigzag
for (i = 0; i != segments; i++) {
int nx = 0;
switch (i & 3) {
case 0: nx = 1; break;
case 2: nx = -1; break;
default: nx = 0; break;
}
double v = v1+(v3-v1)*i/divide;
if (i >= divide)
v = v3+(v2-v3)*(i-divide)/(segments-divide);
setVoltageColor(g, v);
interpPoint(lead1, lead2, ps1, i*segf, hs*ox);
interpPoint(lead1, lead2, ps2, (i+1)*segf, hs*nx);
drawThickLine(g, ps1, ps2);
ox = nx;
}
} else {
// draw rectangle
setVoltageColor(g, v1);
interpPoint2(lead1, lead2, ps1, ps2, 0, hs);
drawThickLine(g, ps1, ps2);
for (i = 0; i != segments; i++) {
double v = v1+(v3-v1)*i/divide;
if (i >= divide)
v = v3+(v2-v3)*(i-divide)/(segments-divide);
setVoltageColor(g, v);
interpPoint2(lead1, lead2, ps1, ps2, i*segf, hs);
interpPoint2(lead1, lead2, ps3, ps4, (i+1)*segf, hs);
drawThickLine(g, ps1, ps3);
drawThickLine(g, ps2, ps4);
}
interpPoint2(lead1, lead2, ps1, ps2, 1, hs);
drawThickLine(g, ps1, ps2);
}
setVoltageColor(g, v3);
drawThickLine(g, post3, corner2);
drawThickLine(g, corner2, arrowPoint);
drawThickLine(g, arrow1, arrowPoint);
drawThickLine(g, arrow2, arrowPoint);
curcount1 = updateDotCount(current1, curcount1);
curcount2 = updateDotCount(current2, curcount2);
curcount3 = updateDotCount(current3, curcount3);
if (sim.dragElm != this) {
drawDots(g, point1, midpoint, curcount1);
drawDots(g, point2, midpoint, curcount2);
drawDots(g, post3, corner2, curcount3);
drawDots(g, corner2, midpoint,
curcount3+distance(post3, corner2));
}
drawPosts(g);
}
void reset() {
curcount1 = curcount2 = curcount3 = 0;
super.reset();
}
void calculateCurrent() {
if (resistance1 == 0)
return; // avoid NaN
current1 = (volts[0]-volts[2])/resistance1;
current2 = (volts[1]-volts[2])/resistance2;
current3 = -current1-current2;
}
@Override double getCurrentIntoPoint(int xa, int ya) {
if (xa == point1.x && ya == point1.y)
return -current1;
if (xa == point2.x && ya == point2.y)
return -current2;
return -current3;
}
void stamp() {
resistance1 = maxResistance*position;
resistance2 = maxResistance*(1-position);
sim.stampResistor(nodes[0], nodes[2], resistance1);
sim.stampResistor(nodes[2], nodes[1], resistance2);
}
void getInfo(String arr[]) {
arr[0] = "potentiometer";
arr[1] = "Vd = " + getVoltageDText(getVoltageDiff());
arr[2] = "R1 = " + getUnitText(resistance1, sim.ohmString);
arr[3] = "R2 = " + getUnitText(resistance2, sim.ohmString);
arr[4] = "I1 = " + getCurrentDText(current1);
arr[5] = "I2 = " + getCurrentDText(current2);
}
public EditInfo getEditInfo(int n) {
// ohmString doesn't work here on linux
if (n == 0)
return new EditInfo("Resistance (ohms)", maxResistance, 0, 0);
if (n == 1) {
EditInfo ei = new EditInfo("Slider Text", 0, -1, -1);
ei.text = sliderText;
return ei;
}
return null;
}
public void setEditValue(int n, EditInfo ei) {
if (n == 0)
maxResistance = ei.value;
if (n == 1) {
sliderText = ei.textf.getText();
label.setText(sliderText);
sim.setiFrameHeight();
}
}
void setMouseElm(boolean v) {
super.setMouseElm(v);
if (slider!=null)
slider.draw();
}
public void onMouseWheel(MouseWheelEvent e) {
if (slider!=null)
slider.onMouseWheel(e);
}
}