package org.eclipse.ui.views.pdf; import java.util.Map; import java.util.Map.Entry; import java.util.WeakHashMap; import org.eclipse.core.resources.IFile; import org.eclipse.jface.action.IContributionItem; import org.eclipse.ui.part.PageBook; import org.eclipse.ui.views.file.IFileViewType; import org.eclipse.ui.views.pdf.PdfViewToolbarManager.FitToAction; public class PdfViewType implements IFileViewType<PdfViewPage> { public static final String EXTENSION = "pdf"; //$NON-NLS-1$ private final Map<IFile, PdfViewPage> pagesByFile = new WeakHashMap<IFile,PdfViewPage>(); @Override public PdfViewPage createPage(PageBook pageBook, IFile file) throws Exception { PdfViewPage result = new PdfViewPage(pageBook, file); pagesByFile.put(file, result); return result; } private final PdfViewToolbarManager toolbar = new PdfViewToolbarManager(); @Override public IContributionItem[] getToolbarContributions() { if(Activator.getInstance().isJavaFxRuntimeAvailable()){ return toolbar.getToolbarContributions(); }else{ return new IContributionItem[]{}; } } private PdfViewPage page; private void setPage(PdfViewPage page) { this.page = page; } public PdfViewPage getPage() { return page; } public void release(IFile file){ // XXX workaround for Windows PdfViewPage pageToClose = pagesByFile.get(file); if(pageToClose!=null){ pageToClose.closeFile(); pagesByFile.remove(file); } } @Override public void pageShown(PdfViewPage page) { setPage(page); toolbar.setPage(page); page.setToolbar(toolbar); // Restore special zoom setting FitToAction fitToAction = page.getFitToAction(); toolbar.disableFit(); if (fitToAction != null) { fitToAction.setChecked(true); } } @Override public void reload(PdfViewPage page) throws Exception { page.reload(); } @Override public void pageClosed(PdfViewPage page) { page.closeFile(); if(this.page!=null && this.page.getFile()!=null && this.page.getFile().equals(page.getFile())){ if(!this.page.isDisposed()){ this.page.closeFile(); } setPage(null); } if(toolbar.getPage()!=null && toolbar.getPage().getFile()!=null && toolbar.getPage().getFile().equals(page.getFile())){ if(!toolbar.getPage().isDisposed()){ toolbar.getPage().closeFile(); } toolbar.setPage(null); } for (Entry<IFile, PdfViewPage> entry : pagesByFile.entrySet()) { if(page.equals(entry.getValue())){ pagesByFile.remove(entry.getKey()); break; } } } @Override public IFile getFile(IFile sourceFile) { return sourceFile; } }