package framework.RWT; public class RWTSelectionManager { private int size = 0; private WidgetHolder selectedHolder = new WidgetHolder(null, 0, 0); private WidgetHolder upMostHolder; private WidgetHolder leftMostHolder; private RWTSelector selector = new DefaultSelector(); public void add(RWTSelectableWidget widget, int m, int n) { WidgetHolder holder = new WidgetHolder(widget, m, n); if(size == 0) { widget.selected(); selectedHolder = holder; upMostHolder = holder; leftMostHolder = holder; selector.setSelectableWidget(selectedHolder.getSelectableWidget()); } else { //どれくらい下か connectY(holder); //どれくらい右か connectX(holder); } size++; } public void up() { if(selectedHolder.hasUp()) { selectedHolder.getSelectableWidget().deselected(); selectedHolder = selectedHolder.getUp(); selectedHolder.getSelectableWidget().selected(); selector.setSelectableWidget(selectedHolder.getSelectableWidget()); } } public void down() { if(selectedHolder.hasDown()) { selectedHolder.getSelectableWidget().deselected(); selectedHolder = selectedHolder.getDown(); selectedHolder.getSelectableWidget().selected(); selector.setSelectableWidget(selectedHolder.getSelectableWidget()); } } public void right() { if(selectedHolder.hasRight()) { selectedHolder.getSelectableWidget().deselected(); selectedHolder = selectedHolder.getRight(); selectedHolder.getSelectableWidget().selected(); selector.setSelectableWidget(selectedHolder.getSelectableWidget()); } } public void left() { if(selectedHolder.hasLeft()) { selectedHolder.getSelectableWidget().deselected(); selectedHolder = selectedHolder.getLeft(); selectedHolder.getSelectableWidget().selected(); selector.setSelectableWidget(selectedHolder.getSelectableWidget()); } } public RWTWidget getSelectedWidget() { if(selectedHolder != null) { return selectedHolder.getWidget(); } else { return null; } } public void setSelector(RWTSelector c) { selector = c; } public RWTSelector getSelector() { return selector; } /** * 左右をつなげる * @param newHolder */ private void connectX(WidgetHolder newHolder) { WidgetHolder holder = leftMostHolder; while(true) { if(newHolder.getY() < holder.getY()) { //holderのほうが左 if(holder.getLeft() != null) { holder.getLeft().setRight(newHolder); } newHolder.setLeft(holder.getLeft()); holder.setLeft(newHolder); newHolder.setRight(holder); return; } else if(newHolder.getY() == holder.getY()) { if(newHolder.getX() < holder.getX()) { //holderのほうが左 if(holder.getLeft() != null) { holder.getLeft().setRight(newHolder); } newHolder.setLeft(holder.getLeft()); holder.setLeft(newHolder); newHolder.setRight(holder); return; } } //まだ右のやつはいる? if(holder.hasRight()) { holder = holder.getRight(); } //もう右のやつはいない else { holder.setRight(newHolder); newHolder.setLeft(holder); return; } } } /** * 上下をつなげる * @param newHolder */ private void connectY(WidgetHolder newHolder) { WidgetHolder holder = upMostHolder; while(true) { if(newHolder.getX() < holder.getX()) { //holderのほうが左 if(holder.getUp() != null) { holder.getUp().setDown(newHolder); } newHolder.setUp(holder.getUp()); holder.setUp(newHolder); newHolder.setDown(holder); return; } else if(newHolder.getX() == holder.getX()) { if(newHolder.getY() < holder.getY()) { //holderのほうが左 if(holder.getUp() != null) { holder.getUp().setDown(newHolder); } newHolder.setUp(holder.getUp()); holder.setUp(newHolder); newHolder.setDown(holder); return; } } //まだ下のやつはいる? if(holder.hasDown()) { holder = holder.getDown(); } //もう下のやつはいない else { holder.setDown(newHolder); newHolder.setUp(holder); return; } } } private class WidgetHolder { private RWTSelectableWidget widget; //行 private int x; //列 private int y; private WidgetHolder up = null; private WidgetHolder down = null; private WidgetHolder right = null; private WidgetHolder left = null; public WidgetHolder(RWTSelectableWidget r, int m, int n) { widget = r; x = m; y = n; } //getter public RWTWidget getWidget() { return (RWTWidget) widget; } public RWTSelectableWidget getSelectableWidget() { return widget; } public int getX() { return x; } public int getY() { return y; } public WidgetHolder getUp() { return up; } public WidgetHolder getDown() { return down; } public WidgetHolder getRight() { return right; } public WidgetHolder getLeft() { return left; } //setter public void setUp(WidgetHolder d) { up = d; } public void setDown(WidgetHolder d) { down = d; } public void setRight(WidgetHolder d) { right = d; } public void setLeft(WidgetHolder d) { left = d; } public boolean hasUp() { if(up == null) { return false; } return true; } public boolean hasDown() { if(down == null) { return false; } return true; } public boolean hasRight() { if(right == null) { return false; } return true; } public boolean hasLeft() { if(left == null) { return false; } return true; } } }