package org.xmind.ui.internal.utils; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.SubMonitor; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.util.SafeRunnable; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Shell; import org.xmind.core.Core; import org.xmind.core.internal.ElementRegistry; import org.xmind.core.marker.IMarker; import org.xmind.core.marker.IMarkerGroup; import org.xmind.core.marker.IMarkerSheet; import org.xmind.core.style.IStyle; import org.xmind.core.style.IStyleSheet; import org.xmind.core.util.FileUtils; import org.xmind.core.util.Property; import org.xmind.ui.internal.MindMapMessages; import org.xmind.ui.internal.MindMapUIPlugin; import org.xmind.ui.internal.dialogs.DialogUtils; import org.xmind.ui.mindmap.IResourceManager; import org.xmind.ui.mindmap.ITemplate; import org.xmind.ui.mindmap.IWorkbookRef; import org.xmind.ui.mindmap.MindMapUI; import org.xmind.ui.style.Styles; import org.xmind.ui.util.Logger; public class ResourceUtils { public static List<IStyle> duplicateStyles(List<IStyle> styles) { ArrayList<IStyle> newStyles = new ArrayList<IStyle>(); IStyleSheet styleSheet = MindMapUI.getResourceManager() .getUserStyleSheet(); for (IStyle styleDuplicated : styles) { IStyle newStyle = styleSheet.createStyle(styleDuplicated.getType()); Iterator<Property> ps = styleDuplicated.properties(); while (ps.hasNext()) { Property p = ps.next(); newStyle.setProperty(p.key, p.value); } newStyle.setName(NLS.bind(MindMapMessages.ResourceUtil_Copy_name, styleDuplicated.getName())); styleSheet.addStyle(newStyle, IStyleSheet.NORMAL_STYLES); newStyles.add(newStyle); } MindMapUI.getResourceManager().saveUserStyleSheet(); return newStyles; } public static List<IStyle> duplicateThemes(List<IStyle> themes) { ArrayList<IStyle> newThemes = new ArrayList<IStyle>(); IStyleSheet styleSheet = MindMapUI.getResourceManager() .getUserThemeSheet(); for (IStyle styleDuplicated : themes) { IStyle themeCreated = styleSheet .createStyle(styleDuplicated.getType()); themeCreated .setName(NLS.bind(MindMapMessages.ResourceUtil_Copy_name, styleDuplicated.getName())); Iterator<Property> defaultStyles = styleDuplicated.defaultStyles(); while (defaultStyles.hasNext()) { Property p = defaultStyles.next(); IStyle defaultStyle = styleDuplicated.getDefaultStyle(p.key); if (defaultStyle != null) { IStyle styleCreated = styleSheet.createStyle( transformStyleFamilyToStyleType(p.key)); Iterator<Property> ps = defaultStyle.properties(); while (ps.hasNext()) { Property next = ps.next(); styleCreated.setProperty(next.key, next.value); } themeCreated.setDefaultStyleId(p.key, styleCreated.getId()); styleSheet.addStyle(styleCreated, IStyleSheet.AUTOMATIC_STYLES); } } styleSheet.addStyle(themeCreated, IStyleSheet.MASTER_STYLES); newThemes.add(themeCreated); } MindMapUI.getResourceManager().saveUserThemeSheet(); return newThemes; } private static String transformStyleFamilyToStyleType(String family) { if (Styles.FAMILY_CENTRAL_TOPIC.equals(family) || Styles.FAMILY_MAIN_TOPIC.equals(family) || Styles.FAMILY_SUB_TOPIC.equals(family) || Styles.FAMILY_SUMMARY_TOPIC.equals(family) || Styles.FAMILY_FLOATING_TOPIC.equals(family) || Styles.FAMILY_CALLOUT_TOPIC.equals(family)) return IStyle.TOPIC; else if (Styles.FAMILY_RELATIONSHIP.equals(family)) return IStyle.RELATIONSHIP; else if (Styles.FAMILY_BOUNDARY.equals(family)) return IStyle.BOUNDARY; else if (Styles.FAMILY_MAP.equals(family)) return IStyle.MAP; else if (Styles.FAMILY_SUMMARY.equals(family)) return IStyle.SUMMARY; return null; } public static void deleteStyles(List<IStyle> styles) { boolean isTheme = false; for (IStyle style : styles) { if (IStyle.THEME.equals(style.getType())) isTheme = true; IStyleSheet sheet = style.getOwnedStyleSheet(); ElementRegistry elementRegistry = (ElementRegistry) sheet .getAdapter(ElementRegistry.class); elementRegistry.unregister(style); sheet.removeStyle(style); } if (isTheme) MindMapUI.getResourceManager().saveUserThemeSheet(); else MindMapUI.getResourceManager().saveUserStyleSheet(); } public static boolean confirmToDeleteStyles(Shell shell, List<IStyle> styles) { StringBuilder sb = new StringBuilder(styles.size() * 10); boolean isTheme = false; for (IStyle style : styles) { if (IStyle.THEME.equals(style.getType())) isTheme = true; if (sb.length() > 0) { sb.append(','); sb.append(' '); } sb.append('\''); sb.append(style.getName()); sb.append('\''); } String styleNames = sb.toString(); return MessageDialog.openConfirm(shell, NLS.bind(MindMapMessages.DeleteStyles_MessageDialog_title, isTheme ? MindMapMessages.DeleteStyle_MessageDialog_themes : MindMapMessages.DeleteStyle_MessageDialog_styles), NLS.bind(MindMapMessages.DeleteStyle_MessageDialog_description, styleNames)); } public static void deleteTemplates(List<ITemplate> templates) { IResourceManager resourceManager = MindMapUI.getResourceManager(); List<ITemplate> userTemplates = resourceManager.getUserTemplates(); for (ITemplate template : templates) if (userTemplates.contains(template)) { resourceManager.removeUserTemplate(template); } } public static List<ITemplate> duplicateTemplates( List<ITemplate> templates) { final ArrayList<ITemplate> newTemplates = new ArrayList<ITemplate>(); File tempFolder = new File( Core.getWorkspace().getTempDir("transient-templates")); //$NON-NLS-1$ tempFolder.mkdirs(); for (ITemplate template : templates) { final File tempFile = new File(tempFolder, template.getName() + " " //$NON-NLS-1$ + MindMapMessages.ResourceUtil_Duplicate_name + MindMapUI.FILE_EXT_TEMPLATE); if (!tempFile.exists()) { try { tempFile.createNewFile(); } catch (IOException e) { } } final IWorkbookRef tempWR = MindMapUIPlugin.getDefault() .getWorkbookRefFactory() .createWorkbookRef(tempFile.toURI(), null); final IWorkbookRef clonedWR = template.createWorkbookRef(); SafeRunnable.run(new SafeRunnable() { @Override public void run() throws Exception { NullProgressMonitor monitor = new NullProgressMonitor(); try { SubMonitor subMonitor = SubMonitor.convert(monitor, 100); clonedWR.open(subMonitor.newChild(30)); try { tempWR.importFrom(subMonitor.newChild(60), clonedWR); /// Fix duplicate template, thumbnail lose. tempWR.open(monitor); tempWR.save(monitor); } finally { subMonitor.setWorkRemaining(10); clonedWR.close(subMonitor.newChild(5)); tempWR.close(subMonitor.newChild(5)); } } finally { if (monitor != null) monitor.done(); } ITemplate newTemplate = MindMapUI.getResourceManager() .addUserTemplateFromWorkbookURI(tempWR.getURI()); newTemplates.add(newTemplate); if (tempFile != null && tempFile.exists()) { tempFile.delete(); } } }); } return newTemplates; } public static void deleteMarkers(List<IMarker> markers) { for (IMarker marker : markers) marker.getParent().removeMarker(marker); } public static List<IMarker> addMarkersFor(IMarkerGroup markerGroup) { List<IMarker> newMarkers = new ArrayList<IMarker>(); String[] sourcePaths = selectImageFile( Display.getCurrent().getActiveShell()); if (sourcePaths == null) return newMarkers; IMarkerSheet ownedSheet = markerGroup.getOwnedSheet(); for (String sourcePath : sourcePaths) { if (imageValid(sourcePath)) { String targetPath = null; FileInputStream sourceFIS = null; try { sourceFIS = new FileInputStream(sourcePath); targetPath = ownedSheet.allocateMarkerResource(sourceFIS, sourcePath); } catch (IOException e) { Logger.log(e); } finally { if (sourceFIS != null) { try { sourceFIS.close(); } catch (IOException e) { Logger.log(e); } } } if (targetPath != null) { IMarker marker = ownedSheet.createMarker(targetPath); marker.setName(FileUtils.getFileName(sourcePath)); markerGroup.addMarker(marker); newMarkers.add(marker); } } } return newMarkers; } private static String[] selectImageFile(Shell shell) { FileDialog dialog = new FileDialog(shell, SWT.OPEN | SWT.MULTI); DialogUtils.makeDefaultImageSelectorDialog(dialog, true); String open = dialog.open(); if (open == null) return null; String parent = dialog.getFilterPath(); String[] fileNames = dialog.getFileNames(); String[] paths = new String[fileNames.length]; for (int i = 0; i < fileNames.length; i++) { paths[i] = new File(parent, fileNames[i]).getAbsolutePath(); } return paths; } private static boolean imageValid(String sourcePath) { try { new Image(Display.getCurrent(), sourcePath).dispose(); return true; } catch (Throwable e) { } return false; } }