package bd.amazed.docscissors.model;
import java.util.ArrayList;
import java.util.List;
import org.rr.commons.mufs.IResourceHandler;
import bd.amazed.docscissors.doc.DocumentInfo;
import bd.amazed.docscissors.view.Rect;
public class Model {
public static final String PROPERTY_LAST_FILE = "lastFile";
public static final String PROPERTY_LAST_STACK_TYPE= "lastStackType";
private static Model instance;
private List<ModelListener> modelListeners;
private DocumentInfo currentDoc = DocumentInfo.NullDoc();
private double zoomFactor;
private Rect clipboardRect;
private boolean isClipboardCut;
private List<PageGroup> pageGroups;
private Model() {
modelListeners = new ArrayList<>();
reset();
}
private void reset() {
zoomFactor = 1;
pageGroups = new ArrayList<>();
}
public static Model getInstance() {
if (instance == null) {
instance = new Model();
}
return instance;
}
public void addListener(ModelListener listener) {
if (!modelListeners.contains(listener)) {
modelListeners.add(listener);
}
}
/**
*
* @return true if listener has been removed, false if not found
*/
public boolean removeListener(ModelListener listener) {
return modelListeners.remove(listener);
}
/**
*
* @param file file, must not be null. This should be a normalized temp file
* @param originalFile original file
* @param previewImage previewImage, must not be null
*/
public void setDoc(DocumentInfo docFile, List<PageGroup> pageGroups) {
if (currentDoc == null) {
throw new IllegalArgumentException("Cannot set null doc file");
}
this.currentDoc = docFile;
reset(); //on new pdf load reset everything
fireNewDoc(docFile);
setPageGroups(pageGroups);
}
public DocumentInfo getDoc() {
return this.currentDoc;
}
/**
* Notify model that some pdf loading has failed.
*
* @param file
*/
public void setDocLoadFailed(IResourceHandler file, Throwable err) {
fireSetDocFailed(file, err);
}
private void setPageGroups(List<PageGroup> pageGroups) {
this.pageGroups = pageGroups;
firePageGroupChanged(pageGroups);
}
public void copyToClipboard(boolean isCut, Rect rect) {
if (rect != null) {
this.clipboardRect = rect;
this.isClipboardCut = isCut;
fireClipboardCopyEvent(clipboardRect, isClipboardCut);
}
}
public void pasteFromClipboard() {
if (clipboardRect != null) {
fireClipboardPasteEvent(clipboardRect, isClipboardCut);
if (isClipboardCut) {
isClipboardCut = false; // clear clipboard
clipboardRect = null;
}
}
}
public Rect getClipboardRect() {
return clipboardRect;
}
public List<PageGroup> getPageGroups() {
return pageGroups;
}
public PageRectsMap getPageRectsMap() {
PageGroup pageGroup = null;
List<Integer> pages = null;
PageRectsMap pageRectsMap = new PageRectsMap();
for (int i = 0; i < pageGroups.size(); i++) {
pageGroup = pageGroups.get(i);
pages = pageGroup.getPages();
for (int page = 0; page < pages.size(); page++) {
pageRectsMap.putRects(pages.get(page), pageGroup.getRectangles());
}
}
return pageRectsMap;
}
public double getZoomFactor() {
return zoomFactor;
}
protected void fireNewDoc(DocumentInfo docFile) {
for (ModelListener listener : modelListeners) {
listener.newDocLoaded(docFile);
}
}
protected void fireSetDocFailed(IResourceHandler failedFile, Throwable cause) {
for (ModelListener listener : modelListeners) {
listener.docLoadFailed(failedFile, cause);
}
}
protected void firePageGroupChanged(List<PageGroup> pageGroups) {
for (ModelListener listener : modelListeners) {
listener.pageGroupChanged(pageGroups);
}
}
protected void fireZoomChanged(double oldZoomFactor, double newZoomFactor) {
for (ModelListener listener : modelListeners) {
listener.zoomChanged(oldZoomFactor, newZoomFactor);
}
}
protected void fireClipboardCopyEvent(Rect onClipboard, boolean isCut) {
for (ModelListener listener : modelListeners) {
listener.clipboardCopy(isCut, onClipboard);
}
}
protected void fireClipboardPasteEvent(Rect onClipboard, boolean isCut) {
for (ModelListener listener : modelListeners) {
listener.clipboardPaste(isCut, onClipboard);
}
}
}