package jp.crwdev.app.gui; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import jp.crwdev.app.interfaces.ILineHandle; public class SplitLineSet implements ILineHandle { /** 縦ライン */ private List<LineHandle> mLineV = new ArrayList<LineHandle>(); /** 横ライン */ private List<LineHandle> mLineH = new ArrayList<LineHandle>(); /** * コンストラクタ */ public SplitLineSet(){ setSplitColRow(4,4); } public SplitLineSet(float[] v, float[] h){ setSplitColRow(v.length-1, h.length-1); for(int i=0; i<mLineV.size(); i++){ mLineV.get(i).setBaseLineOffset(v[i]); } for(int i=0; i<mLineH.size(); i++){ mLineH.get(i).setBaseLineOffset(h[i]); } } public void setSplitColRow(int col, int row){ if((col == 1 && row > 1) || (col > 1 && row == 1) || (col > 1 && row > 1)){ if((col == mLineV.size() - 1) && (row == mLineH.size() - 1)){ return; } mLineV.clear(); mLineH.clear(); float offset = -0.5f; float add = 1.0f / col; for(int i=0; i<col+1; i++){ mLineV.add(new LineHandle(true, offset, Color.MAGENTA, true)); offset += add; } offset = -0.5f; add = 1.0f / row; for(int i=0; i<row+1; i++){ mLineH.add(new LineHandle(false, offset, Color.MAGENTA, true)); offset += add; } } } public float[] getV(){ float[] v = new float[mLineV.size()]; for(int i=0; i<mLineV.size(); i++){ v[i] = mLineV.get(i).getBaseLineOffset(); } return v; } public float[] getH(){ float[] h = new float[mLineH.size()]; for(int i=0; i<mLineH.size(); i++){ h[i] = mLineH.get(i).getBaseLineOffset(); } return h; } @Override public void fixPosition(boolean fixed) { // NOP } @Override public void getHandleOffset(Dimension offset) { // NOP } @Override public boolean isDragHandle() { for(int i=0; i<mLineV.size(); i++){ if(mLineV.get(i).isDragHandle()){ return true; } } for(int i=0; i<mLineH.size(); i++){ if(mLineH.get(i).isDragHandle()){ return true; } } return false; } @Override public boolean isFixed() { return false; } @Override public void paint(Graphics g, int width, int height, int imageWidth, int imageHeight) { for(int i=0; i<mLineV.size(); i++){ mLineV.get(i).paint(g, width, height, imageWidth, imageHeight); } for(int i=0; i<mLineH.size(); i++){ mLineH.get(i).paint(g, width, height, imageWidth, imageHeight); } } @Override public void resetPosition() { for(int i=0; i<mLineV.size(); i++){ mLineV.get(i).resetPosition(); } for(int i=0; i<mLineH.size(); i++){ mLineH.get(i).resetPosition(); } } @Override public void setBaseLineOffset(float offset) { for(int i=0; i<mLineV.size(); i++){ mLineV.get(i).setBaseLineOffset(offset); } for(int i=0; i<mLineH.size(); i++){ mLineH.get(i).setBaseLineOffset(offset); } } @Override public void mouseClicked(MouseEvent e) { for(int i=0; i<mLineV.size(); i++){ mLineV.get(i).mouseClicked(e); } for(int i=0; i<mLineH.size(); i++){ mLineH.get(i).mouseClicked(e); } } @Override public void mouseEntered(MouseEvent e) { for(int i=0; i<mLineV.size(); i++){ mLineV.get(i).mouseEntered(e); } for(int i=0; i<mLineH.size(); i++){ mLineH.get(i).mouseEntered(e); } } @Override public void mouseExited(MouseEvent e) { for(int i=0; i<mLineV.size(); i++){ mLineV.get(i).mouseExited(e); } for(int i=0; i<mLineH.size(); i++){ mLineH.get(i).mouseExited(e); } } @Override public void mousePressed(MouseEvent e) { for(int i=0; i<mLineV.size(); i++){ mLineV.get(i).mousePressed(e); } for(int i=0; i<mLineH.size(); i++){ mLineH.get(i).mousePressed(e); } } @Override public void mouseReleased(MouseEvent e) { for(int i=0; i<mLineV.size(); i++){ mLineV.get(i).mouseReleased(e); } for(int i=0; i<mLineH.size(); i++){ mLineH.get(i).mouseReleased(e); } } private final LineHandleComparator mComparator = new LineHandleComparator(); @SuppressWarnings("unchecked") @Override public void mouseDragged(MouseEvent e) { for(int i=0; i<mLineV.size(); i++){ LineHandle line = mLineV.get(i); line.mouseDragged(e); float offset = line.getBaseLineOffset(); if(offset < -0.5f){ line.setBaseLineOffset(-0.5f); } else if(offset > 0.5f){ line.setBaseLineOffset(0.5f); } if(line.isDragHandle()){ break; } } Collections.sort(mLineV, mComparator); for(int i=0; i<mLineH.size(); i++){ LineHandle line = mLineH.get(i); line.mouseDragged(e); float offset = line.getBaseLineOffset(); if(offset < -0.5f){ line.setBaseLineOffset(-0.5f); } else if(offset > 0.5f){ line.setBaseLineOffset(0.5f); } if(line.isDragHandle()){ break; } } Collections.sort(mLineH, mComparator); } @Override public void mouseMoved(MouseEvent e) { for(int i=0; i<mLineV.size(); i++){ mLineV.get(i).mouseMoved(e); } for(int i=0; i<mLineH.size(); i++){ mLineH.get(i).mouseMoved(e); } } @SuppressWarnings("rawtypes") private class LineHandleComparator implements Comparator { @Override public int compare(Object arg0, Object arg1) { LineHandle line0 = (LineHandle)arg0; LineHandle line1 = (LineHandle)arg1; float offset0 = line0.getBaseLineOffset(); float offset1 = line1.getBaseLineOffset(); if(offset0 < offset1){ return -1; } else if(offset0 > offset1){ return 1; } else{ return 0; } } } }