package org.docear.plugin.bibtex.actions;
import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import net.sf.jabref.BibtexEntry;
import org.docear.plugin.bibtex.dialogs.MetaDataExtractorPage;
import org.docear.plugin.bibtex.dialogs.MetaDataOptionsPage;
import org.docear.plugin.core.ui.wizard.Wizard;
import org.docear.plugin.core.ui.wizard.WizardPageDescriptor;
import org.docear.plugin.core.ui.wizard.WizardSession;
import org.freeplane.core.ui.components.UITools;
public final class MetaDataAction {
public static MetaDataActionObject showDialog(MetaDataActionObject result) {
if(result.getResult().size() <= 0) return result;
final Wizard wiz = new Wizard(UITools.getFrame());
wiz.setResizable(true);
wiz.getSession().set(result.getClass(), result);
WizardPageDescriptor metadataDescriptor = new WizardPageDescriptor("metadata", new MetaDataExtractorPage()) {
@Override
public WizardPageDescriptor getNextPageDescriptor(WizardSession context) {
MetaDataActionObject data = context.get(MetaDataActionObject.class);
while(data.getResultIterator().hasNext()){
data.setCurrentPDF(data.getResultIterator().next());
if(data.getResult().get(data.getCurrentPDF()).isDuplicatePdf()){
MetaDataDuplicatePage.showDuplicateMessage(context);
}
else{
return context.getModel().getPage("metadata");
}
}
return Wizard.FINISH_PAGE;
}
@Override
public WizardPageDescriptor getBackPageDescriptor(WizardSession context) {
wiz.cancel();
return Wizard.FINISH_PAGE;
}
};
WizardPageDescriptor optionsDescriptor = new WizardPageDescriptor("metadataOptions", new MetaDataOptionsPage()) {
@Override
public WizardPageDescriptor getNextPageDescriptor(WizardSession context) {
return context.getModel().getPage("metadata");
}
@Override
public WizardPageDescriptor getBackPageDescriptor(WizardSession context) {
return context.getModel().getPage("metadata");
}
};
wiz.registerWizardPanel(metadataDescriptor);
wiz.registerWizardPanel(optionsDescriptor);
MetaDataActionObject data = wiz.getSession().get(MetaDataActionObject.class);
while(data.getResultIterator().hasNext()){
data.setCurrentPDF(data.getResultIterator().next());
if(data.getResult().get(data.getCurrentPDF()).isDuplicatePdf()){
MetaDataDuplicatePage.showDuplicateMessage(wiz.getSession());
}
else{
wiz.setStartPage(metadataDescriptor.getIdentifier());
wiz.show();
break;
}
}
return wiz.getSession().get(MetaDataActionObject.class);
}
public static class MetaDataActionObject{
private HashMap<URI, MetaDataActionResult> result = new HashMap<URI, MetaDataActionResult>();
private ArrayList<String> unhandledFiles = new ArrayList<String>();
private Iterator<URI> iterator;
private URI currentPDF;
public ArrayList<String> getUnhandledFiles() {
return unhandledFiles;
}
public HashMap<URI, MetaDataActionResult> getResult() {
return result;
}
public Iterator<URI> getResultIterator(){
if(this.iterator == null){
this.iterator = result.keySet().iterator();
}
return this.iterator;
}
public URI getCurrentPDF() {
if(currentPDF == null){
currentPDF = this.getResultIterator().next();
}
return currentPDF;
}
public void setCurrentPDF(URI currentPDF) {
this.currentPDF = currentPDF;
}
}
public static class MetaDataActionResult {
private BibtexEntry entryToUpdate;
private boolean duplicatePdf;
private boolean showattachOnlyOption;
private BibtexEntry resultEntry;
private boolean selectedBlank;
private boolean selectedFetched;
private boolean selectedXmp;
private boolean attachOnly;
private boolean selectedCancel;
public BibtexEntry getEntryToUpdate() {
return entryToUpdate;
}
public void setEntryToUpdate(BibtexEntry entryToUpdate) {
this.entryToUpdate = entryToUpdate;
}
public boolean isDuplicatePdf() {
return duplicatePdf;
}
public void setDuplicatePdf(boolean duplicatePdf) {
this.duplicatePdf = duplicatePdf;
}
public boolean isShowattachOnlyOption() {
return showattachOnlyOption;
}
public void setShowattachOnlyOption(boolean showattachOnlyOption) {
this.showattachOnlyOption = showattachOnlyOption;
}
public BibtexEntry getResultEntry() {
return resultEntry;
}
public void setResultEntry(BibtexEntry resultEntry) {
this.resultEntry = resultEntry;
}
public boolean isSelectedBlank() {
return selectedBlank;
}
public void setSelectedBlank(boolean selectedBlank) {
this.selectedBlank = selectedBlank;
}
public boolean isSelectedFetched() {
return selectedFetched;
}
public void setSelectedFetched(boolean selectedFetched) {
this.selectedFetched = selectedFetched;
}
public boolean isSelectedXmp() {
return selectedXmp;
}
public void setSelectedXmp(boolean selectedXmp) {
this.selectedXmp = selectedXmp;
}
public boolean isAttachOnly() {
return attachOnly;
}
public void setAttachOnly(boolean attachOnly) {
this.attachOnly = attachOnly;
}
public boolean isSelectedCancel() {
return selectedCancel;
}
public void setSelectedCancel(boolean selectedCancel) {
this.selectedCancel = selectedCancel;
}
}
}