/* ****************************************************************************** * 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.core.internal.dom; import static org.xmind.core.internal.zip.ArchiveConstants.PATH_MARKER_SHEET; import org.xmind.core.IFileEntry; import org.xmind.core.internal.AbstractRefCounter; import org.xmind.core.marker.IMarker; import org.xmind.core.marker.IMarkerGroup; import org.xmind.core.marker.IMarkerResource; import org.xmind.core.marker.IMarkerSheet; import org.xmind.core.util.FileUtils; import org.xmind.core.util.IMarkerRefCounter; public class WorkbookMarkerRefCounter extends AbstractRefCounter implements IMarkerRefCounter { private MarkerSheetImpl sheet; private ManifestImpl manifest; WorkbookMarkerRefCounter(MarkerSheetImpl sheet, ManifestImpl manifest) { this.sheet = sheet; this.manifest = manifest; } protected Object findResource(String resourceId) { return sheet.findMarker(resourceId); } protected void postIncreaseRef(String resourceId, Object resource) { IMarker marker = (IMarker) resource; if (sheet.equals(marker.getOwnedSheet())) { IMarkerGroup group = marker.getParent(); if (group != null) { if (group.getParent() == null) { sheet.addMarkerGroup(group); for (IMarker m : group.getMarkers()) { IMarkerResource res = m.getResource(); if (res instanceof WorkbookMarkerResource) { String fullPath = ((WorkbookMarkerResource) res) .getFullPath(); IFileEntry e = manifest.getFileEntry(fullPath); if (e == null) e = manifest.createFileEntry(fullPath, FileUtils.getMediaType(fullPath)); e.increaseReference(); } } } IFileEntry sheetEntry = manifest.getFileEntry(PATH_MARKER_SHEET); if (sheetEntry == null) { sheetEntry = manifest.createFileEntry(PATH_MARKER_SHEET); } sheetEntry.increaseReference(); } } } protected void postDecreaseRef(String resourceId, Object resource) { IMarker marker = (IMarker) resource; if (sheet.equals(marker.getOwnedSheet())) { IMarkerGroup group = marker.getParent(); if (group != null) { IMarkerSheet parent = group.getParent(); if (sheet.equals(parent)) { if (!isGroupReferenced(group)) { parent.removeMarkerGroup(group); for (IMarker m : group.getMarkers()) { IMarkerResource res = m.getResource(); if (res instanceof WorkbookMarkerResource) { String fullPath = ((WorkbookMarkerResource) res) .getFullPath(); IFileEntry e = manifest.getFileEntry(fullPath); if (e != null) { e.decreaseReference(); } } } } } } if (sheet.isEmpty()) { IFileEntry entry = manifest.getFileEntry(PATH_MARKER_SHEET); if (entry != null) { entry.decreaseReference(); } } } } private boolean isGroupReferenced(IMarkerGroup group) { for (IMarker marker : group.getMarkers()) { int c = getRefCount(marker.getId()); if (c > 0) return true; } return false; } }