package bd.amazed.docscissors.view;
import java.awt.Point;
import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import bd.amazed.docscissors.model.PageGroup;
public class UIHandler {
public static int EDIT_MODE_SELECT = 1;
public static int EDIT_MODE_DRAW = 0;
private int editingMode;
protected ArrayList<Rect> rects; //TODO remove this and use current page group?
protected Rect selectedRect;
protected PageGroup currentPageGroup;
private int page;
private boolean showMergeMode;
private List<UIHandlerListener> listeners;
public UIHandler() {
rects = new ArrayList<>();
listeners = Collections.synchronizedList(new ArrayList<UIHandlerListener>());
reset();
}
public void setPageGroup(PageGroup pageGroup) {
rects = pageGroup.getRects();
selectedRect = null;
this.currentPageGroup = pageGroup;
firePageGroupSelectionChanged(pageGroup);
}
public PageGroup getCurrentPageGroup() {
return currentPageGroup;
}
public int getEditingMode() {
return editingMode;
}
public void setEditingMode(int mode) {
if (mode != EDIT_MODE_DRAW && mode != EDIT_MODE_SELECT) {
throw new IllegalArgumentException("Invalid edit mode");
}
this.editingMode = mode;
fireEditModeChanged();
}
public Iterator<Rect> getRectIterator() {
return rects.iterator();
}
public Rect getSelectedRect() {
return selectedRect;
}
protected void setSelectedRect(Rect rectToSelect) {
if (selectedRect != rectToSelect) { // if change in selection
if (selectedRect != null) // deselect previous selection
selectedRect.setSelected(false);
selectedRect = rectToSelect; // set selection to new rect
if (selectedRect != null) {
rectToSelect.setSelected(true);
}
}
}
public void addRect(Rect rect) {
rects.add(rect);
notifyRectsStateChanged();
}
public ArrayList<Rect> getAllRects() {
return rects;
}
public void deleteSelected() {
delete(selectedRect);
}
public void splitHorizontalSelected(DocPanel pdfPanel) {
if (selectedRect != null) {
Rectangle bounds = selectedRect.bounds;
Point location = bounds.getLocation();
Rectangle leftBounds = new Rectangle(selectedRect.bounds.x, selectedRect.bounds.y, selectedRect.bounds.width / 2, selectedRect.bounds.height);
Rect leftRect = new Rect(location, this);
leftRect.addListener(pdfPanel);
leftRect.setBounds(leftBounds);
Rectangle rightBounds = new Rectangle(selectedRect.bounds.x + selectedRect.bounds.width / 2, selectedRect.bounds.y, selectedRect.bounds.width / 2, selectedRect.bounds.height);
Rect rightRect = new Rect(location, this);
rightRect.addListener(pdfPanel);
rightRect.setBounds(rightBounds);
int indexSelected = rects.indexOf(selectedRect);
delete(selectedRect);
rects.add(indexSelected, rightRect);
rects.add(indexSelected, leftRect);
notifyRectsStateChanged();
}
}
public void splitVerticalSelected(DocPanel pdfPanel) {
if (selectedRect != null) {
Rectangle bounds = selectedRect.bounds;
Point location = bounds.getLocation();
Rectangle upBounds = new Rectangle(selectedRect.bounds.x, selectedRect.bounds.y, selectedRect.bounds.width, selectedRect.bounds.height / 2);
Rect upRect = new Rect(location, this);
upRect.addListener(pdfPanel);
upRect.setBounds(upBounds);
Rectangle downBounds = new Rectangle(selectedRect.bounds.x, selectedRect.bounds.y + selectedRect.bounds.height / 2, selectedRect.bounds.width, selectedRect.bounds.height / 2);
Rect downRect = new Rect(location, this);
downRect.addListener(pdfPanel);
downRect.setBounds(downBounds);
int indexSelected = rects.indexOf(selectedRect);
delete(selectedRect);
rects.add(indexSelected, downRect);
rects.add(indexSelected, upRect);
notifyRectsStateChanged();
}
}
public void delete(Rect rect) {
if (rect != null) {
rects.remove(rect);
if (selectedRect == rect) {
selectedRect = null;
}
rect.fireEvent(null);
notifyRectsStateChanged();
}
}
public int getRectCount() {
return rects.size();
}
public int getIndexOf(Rect rect) {
return rects.indexOf(rect);
}
public void deleteAll() {
Rect anyRect = null;
if (rects.size() > 0) {
anyRect = rects.get(0);
}
rects.clear();
if (anyRect != null) {
anyRect.fireEvent(null); // if canvas repaints whole area once, that
// will do.
}
notifyRectsStateChanged();
}
public void reset() {
deleteAll();
selectedRect = null; // we are removing all rects, so all rects listners should vanish too.
page = 1;
showMergeMode = true;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
firePageChanged();
}
public void setMergeMode(boolean showMergeMode) {
this.showMergeMode = showMergeMode;
}
public boolean isShowMergedMode() {
return showMergeMode;
}
public void addListener(UIHandlerListener listener) {
if (!listeners.contains(listener)) {
listeners.add(listener);
}
}
public void removeAllListeners() {
listeners.clear();
}
private void fireEditModeChanged() {
for (UIHandlerListener listener : listeners) {
listener.editingModeChanged(editingMode);
}
}
private void firePageChanged() {
for (UIHandlerListener listener : listeners) {
listener.pageChanged(page);
}
}
private void firePageGroupSelectionChanged(PageGroup pageGroup) {
for (UIHandlerListener listener : listeners) {
listener.pageGroupSelected(pageGroup);
}
}
public void notifyRectsStateChanged() {
for (UIHandlerListener listener : listeners) {
listener.rectsStateChanged();
}
}
public void equalizeWidthOfSelected(int viewWidth) {
int maxWidth = -1;
for (Rect rect : rects) {
if (rect.bounds.width > maxWidth) {
maxWidth = rect.bounds.width;
}
}
for (Rect rect : rects) {
rect.bounds.width = maxWidth;
if (rect.bounds.x + maxWidth > viewWidth) {
rect.bounds.x = viewWidth - maxWidth;
}
}
if (rects.size() > 0) {
rects.get(0).fireEvent(null);
}
notifyRectsStateChanged();
}
public void equalizeHeightOfSelected(int viewHeight) {
int maxHeight = -1;
for (Rect rect : rects) {
if (rect.bounds.height > maxHeight) {
maxHeight = rect.bounds.height;
}
}
for (Rect rect : rects) {
rect.bounds.height = maxHeight;
if (rect.bounds.y + maxHeight > viewHeight) {
rect.bounds.y = viewHeight - maxHeight;
}
}
if (rects.size() > 0) {
rects.get(0).fireEvent(null);
}
notifyRectsStateChanged();
}
}