/* ****************************************************************************** * Copyright (c) 2006-2012 XMind Ltd. and others. * * This file is a part of XMind 3. XMind releases 3 and * above are dual-licensed under the Eclipse Public License (EPL), * which is available at http://www.eclipse.org/legal/epl-v10.html * and the GNU Lesser General Public License (LGPL), * which is available at http://www.gnu.org/licenses/lgpl.html * See http://www.xmind.net/license.html for details. * * Contributors: * XMind Ltd. - initial API and implementation *******************************************************************************/ package org.xmind.ui.internal.editor; import java.net.URI; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.util.PropertyChangeEvent; import org.xmind.core.Core; import org.xmind.core.IEncryptionHandler; import org.xmind.core.IMeta; import org.xmind.core.IRevision; import org.xmind.core.IRevisionManager; import org.xmind.core.IRevisionRepository; import org.xmind.core.ISheet; import org.xmind.core.IWorkbook; import org.xmind.core.event.CoreEvent; import org.xmind.core.event.CoreEventRegister; import org.xmind.core.event.ICoreEventListener; import org.xmind.core.event.ICoreEventSource; import org.xmind.core.event.ICoreEventSource2; import org.xmind.core.event.ICoreEventSupport; import org.xmind.core.internal.dom.WorkbookImpl; import org.xmind.core.io.IStorage; import org.xmind.core.marker.IMarker; import org.xmind.core.marker.IMarkerGroup; import org.xmind.core.marker.IMarkerSheet; import org.xmind.gef.GEF; import org.xmind.gef.command.CommandStack; import org.xmind.gef.command.CommandStackEvent; import org.xmind.gef.command.ICommandStack; import org.xmind.gef.command.ICommandStackListener; import org.xmind.ui.internal.MindMapMessages; import org.xmind.ui.internal.MindMapUIPlugin; import org.xmind.ui.mindmap.MindMapUI; import org.xmind.ui.prefs.PrefConstants; /** * @author Frank Shaka * @since 3.0 * @deprecated */ @Deprecated public class WorkbookRef // implements IWorkbookRef, IPropertyChangeListener { { // @Deprecated // private final WorkbookRefManager manager; @Deprecated private URI uri; @Deprecated private String name; @Deprecated private IWorkbook workbook; @Deprecated private ICommandStack commandStack; @Deprecated private IAdaptable activeContext; // @Deprecated // private IWorkbookRefStatus status; @Deprecated private boolean undoing = false; // @Deprecated // private ListenerList listeners = new ListenerList(); @Deprecated private CoreEventRegister globalEventRegister = null; @Deprecated private ICoreEventListener globalEventListener = new ICoreEventListener() { public void handleCoreEvent(CoreEvent event) { handleGlobalEvent(event); } }; @Deprecated public WorkbookRef(WorkbookRefManager manager, URI uri, IWorkbook workbook, String name) { // this.manager = manager; this.uri = uri; this.workbook = workbook; this.name = name; this.commandStack = new CommandStack( Math.max(MindMapUIPlugin.getDefault().getPreferenceStore() .getInt(PrefConstants.UNDO_LIMIT), 1)); this.commandStack.addCSListener(new ICommandStackListener() { public void handleCommandStackEvent(CommandStackEvent event) { handleCommandStackChange(event); } }); // MindMapUIPlugin.getDefault().getPreferenceStore() // .addPropertyChangeListener(this); // int statusCode = workbook == null ? IWorkbookRefStatus.LOADING // : IWorkbookRefStatus.CLEAN; // this.status = new WorkbookRefStatus(statusCode, // IWorkbookRefStatus.INITIAL, // new Status(IStatus.INFO, MindMapUIPlugin.PLUGIN_ID, null)); } @Deprecated public URI getURI() { return this.uri; } @Deprecated public String getName() { return this.name; } @Deprecated public ICommandStack getCommandStack() { return this.commandStack; } @Deprecated public IWorkbook getWorkbook() { return this.workbook; } @Deprecated public IAdaptable getActiveContext() { return this.activeContext; } // @Deprecated // public void addStatusListener(IWorkbookRefStatusListener listener) { // listeners.add(listener); // } // // @Deprecated // public void removeListener(IWorkbookRefStatusListener listener) { // listeners.remove(listener); // } // // public IWorkbookRefStatus getStatus() { // return status; // } @Deprecated public void markDirty() { } @Deprecated protected void setURI(URI uri) { this.uri = uri; } @Deprecated protected void setWorkbook(IWorkbook workbook) { if (workbook == this.workbook) return; if (globalEventRegister != null) { globalEventRegister.unregisterAll(); } this.workbook = workbook; if (workbook != null) { IMarkerSheet markerSheet = workbook.getMarkerSheet(); if (markerSheet != null) { markerSheet.setParentSheet( MindMapUI.getResourceManager().getUserMarkerSheet()); } if (globalEventRegister == null) { globalEventRegister = new CoreEventRegister( globalEventListener); } registerGlobalEvents(globalEventRegister, workbook); } } /* * (non-Javadoc) * * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class) */ @Deprecated public <T> T getAdapter(Class<T> adapter) { if (adapter == URI.class) return adapter.cast(getURI()); if (adapter == IWorkbook.class) return adapter.cast(getWorkbook()); if (adapter == ICommandStack.class) return adapter.cast(getCommandStack()); if (activeContext != null) return activeContext.getAdapter(adapter); return null; } @Deprecated public void close() { // MindMapUIPlugin.getDefault().getPreferenceStore() // .removePropertyChangeListener(this); if (commandStack != null) { commandStack.dispose(); commandStack = null; } if (globalEventRegister != null) { globalEventRegister.unregisterAll(); globalEventRegister = null; } if (workbook != null) { closeWorkbook(workbook); } workbook = null; } @Deprecated private void closeWorkbook(IWorkbook workbook) { ICoreEventSupport support = (ICoreEventSupport) workbook .getAdapter(ICoreEventSupport.class); if (support != null) { support.dispatchTargetChange((ICoreEventSource) workbook, MindMapUI.WorkbookClose, this); } } @Deprecated public boolean isContentDirty() { if (workbook == null) return false; if (getCommandStack() != null && getCommandStack().isDirty()) return true; return workbook instanceof ICoreEventSource2 && ((ICoreEventSource2) workbook) .hasOnceListeners(Core.WorkbookPreSaveOnce); } @Deprecated public boolean isDirty() { return isContentDirty(); } @Deprecated public void loadWorkbook(IEncryptionHandler encryptionHandler, IProgressMonitor monitor) throws CoreException { // synchronized (ioLock) { // loadWorkbook(createStorage(), encryptionHandler, monitor); // } } @Deprecated public void loadWorkbook(IStorage storage, IEncryptionHandler encryptionHandler, IProgressMonitor monitor) throws CoreException { // synchronized (ioLock) { if (workbook != null) return; // if (workbookLoader == null) // throw new CoreException( // new Status(IStatus.ERROR, MindMapUIPlugin.PLUGIN_ID, // "No workbook loader is set.")); //$NON-NLS-1$ // // setWorkbook(workbookLoader.loadWorkbook(storage, encryptionHandler, // monitor)); // } } @Deprecated public void saveWorkbook(IProgressMonitor monitor, IWorkbookReferrer previewSaver, boolean skipNewRevisions) throws CoreException { // synchronized (ioLock) { monitor.beginTask(null, 100); if (workbook == null) throw new CoreException(new Status(IStatus.ERROR, MindMapUIPlugin.PLUGIN_ID, "No workbook to save.")); //$NON-NLS-1$ // if (workbookSaver == null) // throw new CoreException( // new Status(IStatus.ERROR, MindMapUIPlugin.PLUGIN_ID, // "No workbook saver has been set.")); //$NON-NLS-1$ // Leave 1 tick for finalizing work: int mainWorkTicks = 99; if (!skipNewRevisions) { monitor.subTask( MindMapMessages.WorkbookSaver_CreateRevisions_taskName); saveRevisions(monitor); } monitor.worked(10); mainWorkTicks -= 10; // Delete old preview: workbook.getManifest().deleteFileEntry("Thumbnails/thumbnail.jpg"); //$NON-NLS-1$ workbook.getManifest().deleteFileEntry("Thumbnails/thumbnail.png"); //$NON-NLS-1$ if (previewSaver != null) { monitor.subTask( MindMapMessages.WorkbookSaver_SavePreviewImage_taskName); // savePreview(monitor); } else { // setPreviewOutdated(true); } monitor.worked(10); mainWorkTicks -= 10; monitor.subTask( MindMapMessages.WorkbookSaver_SaveWorkbookContent_taskName); // WorkbookBackupManager wbm = WorkbookBackupManager.getInstance(); // IWorkbookBackup backup = wbm.ensureBackedUp(this, monitor); try { // workbookSaver.save(monitor, workbook); } catch (Throwable e) { // if (backup != null) { // backup.restore(monitor); // } if (e instanceof CoreException) throw (CoreException) e; throw new CoreException(new Status(IStatus.ERROR, MindMapUI.PLUGIN_ID, e.getLocalizedMessage(), e)); } // wbm.removeWorkbook(this); // wbm.addWorkbook(this); monitor.worked(mainWorkTicks); monitor.subTask(MindMapMessages.WorkbookSaver_Finalize_taskName); // for (IWorkbookReferrer referrer : getReferrers()) { // referrer.postSave(monitor); // } monitor.done(); // } } @Deprecated public void saveWorkbookAs(Object newKey, IProgressMonitor monitor, IWorkbookReferrer previewSaver, boolean skipNewRevisions) throws CoreException { // synchronized (ioLock) { monitor.beginTask(null, 100); if (workbook == null) throw new CoreException(new Status(IStatus.ERROR, MindMapUIPlugin.PLUGIN_ID, "No workbook to save.")); //$NON-NLS-1$ monitor.subTask( MindMapMessages.WorkbookSaver_PrepareNewSaveTarget_taskName); // Object oldKey = getKey(); // setKey(newKey); // setWorkbookLoader(null); // setWorkbookSaver(null); // WorkbookRefInitializer.getInstance().initialize(this, newKey, // getPrimaryReferrer()); // if (workbookSaver == null) // throw new CoreException( // new Status(IStatus.ERROR, MindMapUIPlugin.PLUGIN_ID, // "No workbook saver has been set.")); //$NON-NLS-1$ // Leave 1 tick for finalizing work: int mainWorkTicks = 99; // WorkbookRefManager.getInstance().changeKey(this, oldKey, newKey); monitor.worked(10); mainWorkTicks -= 10; if (!skipNewRevisions) { monitor.subTask( MindMapMessages.WorkbookSaver_CreateRevisions_taskName); saveRevisions(monitor); } monitor.worked(10); mainWorkTicks -= 10; // Delete old preview: workbook.getManifest().deleteFileEntry("Thumbnails/thumbnail.jpg"); //$NON-NLS-1$ workbook.getManifest().deleteFileEntry("Thumbnails/thumbnail.png"); //$NON-NLS-1$ if (previewSaver != null) { monitor.subTask( MindMapMessages.WorkbookSaver_SavePreviewImage_taskName); // savePreview(monitor); } else { // setPreviewOutdated(true); } monitor.worked(10); mainWorkTicks -= 10; monitor.subTask( MindMapMessages.WorkbookSaver_SaveWorkbookContent_taskName); // workbookSaver.save(monitor, workbook); monitor.worked(mainWorkTicks); // WorkbookBackupManager.getInstance().removeWorkbook(this); // WorkbookBackupManager.getInstance().addWorkbook(this); monitor.subTask(MindMapMessages.WorkbookSaver_Finalize_taskName); // for (IWorkbookReferrer referrer : getReferrers()) { // referrer.postSaveAs(newKey, monitor); // } monitor.done(); // } } @Deprecated private void saveRevisions(IProgressMonitor monitor) throws CoreException { if (!isContentDirty() || ((WorkbookImpl) workbook).isSkipRevisionsWhenSaving() || !shouldSaveNewRevisions()) return; IRevisionRepository repo = workbook.getRevisionRepository(); for (ISheet sheet : workbook.getSheets()) { IRevisionManager manager = repo.getRevisionManager(sheet.getId(), IRevision.SHEET); IRevision latestRevision = manager.getLatestRevision(); if (latestRevision == null || sheet.getModifiedTime() == 0 || sheet .getModifiedTime() > latestRevision.getTimestamp()) { try { manager.addRevision(sheet); } catch (Throwable e) { throw new CoreException(new Status(IStatus.ERROR, MindMapUIPlugin.PLUGIN_ID, null, e)); } } } } @Deprecated private boolean shouldSaveNewRevisions() { String value = workbook.getMeta() .getValue(IMeta.CONFIG_AUTO_REVISION_GENERATION); return value == null || IMeta.V_YES.equalsIgnoreCase(value); } @Deprecated public void propertyChange(PropertyChangeEvent event) { if (commandStack != null) { if (PrefConstants.UNDO_LIMIT.equals(event.getProperty())) { commandStack.setUndoLimit( Math.max((Integer) event.getNewValue(), 1)); } } } @Deprecated public String toString() { return uri == null ? (workbook == null ? "UnrecognizedWorkbookRef" //$NON-NLS-1$ : workbook.toString()) : uri.toString(); } @Deprecated private void registerGlobalEvents(CoreEventRegister register, IWorkbook workbook) { ICoreEventSupport support = (ICoreEventSupport) workbook .getAdapter(ICoreEventSupport.class); if (support != null) { register.setNextSupport(support); register.register(Core.MarkerRefAdd); } } @Deprecated private void handleGlobalEvent(CoreEvent event) { String type = event.getType(); if (Core.MarkerRefAdd.equals(type)) { handleMarkerAdded((String) event.getTarget()); } } @Deprecated private void handleMarkerAdded(String markerId) { if (undoing) return; IMarker systemMarker = MindMapUI.getResourceManager() .getSystemMarkerSheet().findMarker(markerId); if (systemMarker != null) { IMarkerGroup group = systemMarker.getParent(); if (group != null) { if (group.getParent() != null && group.getParent().equals( MindMapUI.getResourceManager().getSystemMarkerSheet())) MindMapUI.getResourceManager().getRecentMarkerGroup() .addMarker(systemMarker); } } IMarker userMarker = MindMapUI.getResourceManager().getUserMarkerSheet() .findMarker(markerId); if (userMarker != null) { IMarkerGroup group = userMarker.getParent(); if (group != null) { if (group.getParent() != null && group.getParent().equals( MindMapUI.getResourceManager().getUserMarkerSheet())) { MindMapUI.getResourceManager().getRecentMarkerGroup() .addMarker(userMarker); } } } } @Deprecated private void handleCommandStackChange(CommandStackEvent event) { int status = event.getStatus(); if ((status & GEF.CS_PRE_UNDO) != 0) { undoing = true; } else if ((status & GEF.CS_POST_UNDO) != 0) { undoing = false; } } }