partStacks = modelService.findElements(window,
+ partStackId, MPartStack.class, null);
+ if (partStacks.isEmpty()) {
+ return null;
+ }
+ MPartStack partStack = partStacks.get(0);
+
+ MPart visiblePart = null;
+ MStackElement selectedElement = partStack.getSelectedElement();
+ if (selectedElement instanceof MPlaceholder) {
+ MPlaceholder placeholder = (MPlaceholder) selectedElement;
+ visiblePart = partService.findPart(placeholder.getElementId());
+ } else if (selectedElement instanceof MPart) {
+ visiblePart = (MPart) selectedElement;
+ }
+
+ if (visiblePart != null) {
+ visiblePart.setVisible(false);
+ partService.hidePart(visiblePart);
+ return visiblePart.getElementId();
+ }
+
+ return null;
+ }
+
}
diff --git a/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/DashboardContent.java b/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/DashboardContent.java
index 23eee4e1a..a5050ef48 100644
--- a/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/DashboardContent.java
+++ b/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/DashboardContent.java
@@ -11,6 +11,7 @@
import javax.xml.parsers.DocumentBuilderFactory;
import org.eclipse.core.runtime.Platform;
+import org.eclipse.e4.core.contexts.ContextInjectionFactory;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.swt.SWT;
@@ -102,10 +103,15 @@ private void loadFromDefaultLocation() {
}
// set primary selection
- tabFolder.setSelection(findPrimarySelection());
+ MTabItem primarySelection = findPrimarySelection();
+ tabFolder.setSelection(primarySelection);
- IDashboardPage page = getDashboardPage(tabFolder.getSelection());
+ IDashboardPage page = getDashboardPage(primarySelection);
if (page != null) {
+ if (page.getControl() == null || page.getControl().isDisposed()) {
+ page.createControl(this.tabFolder.getBody());
+ primarySelection.setControl(page.getControl());
+ }
handlePageSelected(page);
}
}
@@ -188,13 +194,14 @@ private MTabItem readPage(Element element, MTabFolder tabFolder)
// ignore errors caused contribution not found
return null;
}
- Object contribution = cls.newInstance();
+
+ Object contribution = ContextInjectionFactory.make(cls,
+ part.getContext());
if (!(contribution instanceof IDashboardPage))
throw new IllegalArgumentException(
"Invalid contribution type: " + contribution); //$NON-NLS-1$
final IDashboardPage page = (IDashboardPage) contribution;
-
page.setContext(part);
String label = readLabel(element);
@@ -209,8 +216,8 @@ private MTabItem readPage(Element element, MTabFolder tabFolder)
item.setText(page.getTitle());
item.setImage(page.getImage());
- page.createControl(this.tabFolder.getBody());
- item.setControl(page.getControl());
+// page.createControl(this.tabFolder.getBody());
+// item.setControl(page.getControl());
item.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
@@ -393,7 +400,7 @@ public IDashboardPage getDashboardPage(MTabItem item) {
return data instanceof IDashboardPage ? (IDashboardPage) data : null;
}
- private void handlePageSelected(final IDashboardPage page) {
+ protected void handlePageSelected(final IDashboardPage page) {
ISelectionProvider selectionProvider = CathyPlugin.getAdapter(page,
ISelectionProvider.class);
part.setSelectionProvider(selectionProvider);
diff --git a/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/DashboardPart.java b/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/DashboardPart.java
index c7d44fe5e..0e6e9a83f 100644
--- a/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/DashboardPart.java
+++ b/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/DashboardPart.java
@@ -1,4 +1,3 @@
-
package org.xmind.cathy.internal.dashboard;
import java.util.Arrays;
@@ -42,6 +41,7 @@
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IWorkbenchCommandConstants;
import org.eclipse.ui.IWorkbenchPage;
@@ -154,6 +154,10 @@ protected IEclipseContext getContext() {
@PostConstruct
public void postConstruct(Composite parent) {
+
+ //
+ context.set(IDashboardContext.class, this);
+
tabFolder = new MTabFolder(parent);
ResourceManager resourceManager = new LocalResourceManager(
JFaceResources.getResources(), tabFolder);
@@ -175,6 +179,9 @@ public void handleEvent(org.eclipse.swt.widgets.Event event) {
}
private void handlePageSelected() {
+ if (tabFolder == null || content == null) {
+ return;
+ }
MTabItem item = tabFolder.getSelection();
String pageId = item == null ? null : content.getItemId(item);
partModel.getTransientData()
@@ -194,7 +201,7 @@ protected void executeCommand(String commandId,
handlerService.executeHandler(command);
}
- protected void setSelectionProvider(ISelectionProvider selectionProvider) {
+ public void setSelectionProvider(ISelectionProvider selectionProvider) {
ISelectionProvider oldSelectionProvider = this.selectionProvider;
if (selectionProvider == oldSelectionProvider)
return;
@@ -223,7 +230,6 @@ private void handleSelectionChanged(SelectionChangedEvent event) {
* Disables almost all commands unless explicitly kept enabled, to make sure
* that the user can't trigger commands that may not be appropriate during
* the appearance of the Dashboard.
- *
*
* We activate a {@link DisabledHandler} handler object for each command to
* be disabled. These handlers are registered within the context of this
@@ -306,12 +312,17 @@ public void subscribeDashboardTransientData(
if (selectedPageId == null || !(selectedPageId instanceof String))
return;
- if (this.tabFolder == null)
+ if (this.tabFolder == null || content == null)
return;
MTabItem item = content.getItemById((String) selectedPageId);
IDashboardPage dashboardPage = content.getDashboardPage(item);
if (dashboardPage != null) {
+ Control control = dashboardPage.getControl();
+ if (control == null || control.isDisposed()) {
+ dashboardPage.createControl(this.tabFolder.getBody());
+ item.setControl(dashboardPage.getControl());
+ }
dashboardPage.setFocus();
this.tabFolder.setSelection(item);
}
@@ -319,7 +330,7 @@ public void subscribeDashboardTransientData(
@Focus
public void setFocus() {
- if (tabFolder != null && !tabFolder.isDisposed()) {
+ if (tabFolder != null && !tabFolder.isDisposed() && content != null) {
MTabItem item = tabFolder.getSelection();
if (item != null) {
IDashboardPage page = content.getDashboardPage(item);
@@ -351,27 +362,33 @@ public void registerAvailableCommandId(String commandId) {
}
public boolean registerContextMenu(Object menuParent, final String menuId) {
- if (menuService != null) {
- if (modelService != null & partModel != null) {
- MPopupMenu menuModel = null;
- for (MMenu item : partModel.getMenus()) {
- if (menuId.equals(item.getElementId())
- && item instanceof MPopupMenu) {
- menuModel = (MPopupMenu) item;
- break;
- }
- }
- if (menuModel == null) {
- menuModel = modelService
- .createModelElement(MPopupMenu.class);
- menuModel.setElementId(menuId);
- menuModel.getTags().add("menuContribution:popup"); //$NON-NLS-1$
- partModel.getMenus().add(menuModel);
- }
+ if (!(menuParent instanceof Control) || menuService == null
+ || partModel == null) {
+ return false;
+ }
+ Control parentControl = (Control) menuParent;
+ MPopupMenu menuModel = null;
+ for (MMenu item : partModel.getMenus()) {
+ if (menuId.equals(item.getElementId())
+ && item instanceof MPopupMenu) {
+ menuModel = (MPopupMenu) item;
+ break;
}
- return menuService.registerContextMenu(menuParent, menuId);
}
- return false;
+ if (menuModel == null) {
+ menuModel = modelService.createModelElement(MPopupMenu.class);
+ menuModel.setElementId(menuId);
+ menuModel.getTags().add("menuContribution:popup"); //$NON-NLS-1$
+ partModel.getMenus().add(menuModel);
+ }
+
+ if (menuModel.getWidget() instanceof Menu) {
+ Menu menu = (Menu) menuModel.getWidget();
+ parentControl.setMenu(menu);
+ return true;
+ }
+
+ return menuService.registerContextMenu(parentControl, menuId);
}
public boolean openEditor(final IEditorInput input, final String editorId) {
@@ -407,7 +424,6 @@ public boolean showView(final String viewId) {
/*
* (non-Javadoc)
- *
* @see
* org.xmind.ui.internal.dashboard.pages.IDashboardContext#getPersistedState
* (java.lang.String)
@@ -420,7 +436,6 @@ public String getPersistedState(String key) {
/*
* (non-Javadoc)
- *
* @see
* org.xmind.ui.internal.dashboard.pages.IDashboardContext#setPersistedState
* (java.lang.String, java.lang.String)
@@ -438,7 +453,6 @@ public void setPersistedState(String key, String value) {
/*
* (non-Javadoc)
- *
* @see org.xmind.ui.internal.dashboard.pages.IDashboardContext#
* getContextVariable(java.lang.Class)
*/
@@ -448,7 +462,6 @@ public T getContextVariable(Class key) {
/*
* (non-Javadoc)
- *
* @see org.xmind.ui.internal.dashboard.pages.IDashboardContext#
* getContextVariable(java.lang.String)
*/
@@ -456,4 +469,4 @@ public Object getContextVariable(String key) {
return context.get(key);
}
-}
\ No newline at end of file
+}
diff --git a/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/NewFileDashboardPage.java b/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/NewFileDashboardPage.java
index 374804738..48f34610e 100644
--- a/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/NewFileDashboardPage.java
+++ b/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/NewFileDashboardPage.java
@@ -1,11 +1,15 @@
package org.xmind.cathy.internal.dashboard;
import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import javax.annotation.PostConstruct;
+
+import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.SafeRunner;
import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ToolBarManager;
-import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.action.IAction;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.resource.ColorDescriptor;
@@ -14,39 +18,37 @@
import org.eclipse.jface.resource.ResourceManager;
import org.eclipse.jface.util.SafeRunnable;
import org.eclipse.jface.util.Util;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StackLayout;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseTrackAdapter;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
-import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.ToolBar;
+import org.xmind.cathy.internal.CathyPlugin;
import org.xmind.cathy.internal.WorkbenchMessages;
import org.xmind.ui.internal.dashboard.pages.DashboardPage;
+import org.xmind.ui.internal.dashboard.pages.IDashboardContext;
import org.xmind.ui.internal.dashboard.pages.IDashboardPage;
-import org.xmind.ui.mindmap.ITemplate;
import org.xmind.ui.mindmap.MindMapUI;
import org.xmind.ui.resources.ColorUtils;
import org.xmind.ui.tabfolder.MTabBar;
import org.xmind.ui.tabfolder.MTabBarItem;
import org.xmind.ui.util.StyleProvider;
-public class NewFileDashboardPage extends DashboardPage
- implements ISelectionChangedListener {
+public class NewFileDashboardPage extends DashboardPage implements IAdaptable {
private class SegmentBarStyleProvider extends StyleProvider {
@Override
@@ -142,15 +144,29 @@ public int getAlpha(Object widget, String key, int defaultValue) {
private Composite titleBar = null;
private Composite rightBar = null;
private MTabBar tabBar = null;
- private ToolBar normalModeEditContainer = null;
- private Control editModeContainer = null;
-
- private boolean normalOrEditMode = true;
private Composite pageContainer = null;
- private ITemplate selectedTemplate = null;
- private Action deleteTemplatesAction = null;
+ private List pages = new ArrayList();
+
+ @PostConstruct
+ private void init(IDashboardContext dashboardContext) {
+ NewFromStructuresDashboardPage structurePage = new NewFromStructuresDashboardPage();
+ structurePage.setTitle(WorkbenchMessages.DashboardBlankPage_name);
+ structurePage
+ .setDescription(WorkbenchMessages.DashboardBlankPage_message);
+ structurePage.setContext(dashboardContext);
+ pages.add(structurePage);
+
+ NewFromTemplatesDashboardPage templatePage = new NewFromTemplatesDashboardPage();
+ templatePage.setTitle(WorkbenchMessages.DashboardTemplatesPage_name);
+ templatePage.setDescription(
+ WorkbenchMessages.DashboardTemplatesPage_message);
+ templatePage.setContext(dashboardContext);
+ templatePage.registerAvailableCommands();
+ pages.add(templatePage);
+
+ }
public void createControl(Composite parent) {
final Composite composite = new Composite(parent, SWT.NONE);
@@ -178,12 +194,11 @@ public void createControl(Composite parent) {
this.control = composite;
- addPage(new NewFromStructuresDashboardPage(),
- WorkbenchMessages.DashboardBlankPage_name,
- WorkbenchMessages.DashboardBlankPage_message);
- addPage(new NewFromTemplatesDashboardPage(),
- WorkbenchMessages.DashboardTemplatesPage_name,
- WorkbenchMessages.DashboardTemplatesPage_message);
+ for (IDashboardPage page : pages) {
+ MTabBarItem item = new MTabBarItem(tabBar, SWT.RADIO);
+ item.setText(page.getTitle());
+ item.setData(page);
+ }
setTitleBarComponentLayoutData();
@@ -196,8 +211,8 @@ private void setTitleBarComponentLayoutData() {
// CAUTION: This depends on the fact that the size won't change.
Point tabSize = tabBar.computeSize(SWT.DEFAULT, SWT.DEFAULT);
tabData.left = new FormAttachment(50, -tabSize.x / 2);
- tabData.top = new FormAttachment(0, 0);
- tabData.bottom = new FormAttachment(100, 0);
+ tabData.top = new FormAttachment(50, -tabSize.y / 2);
+ tabData.bottom = new FormAttachment(50, tabSize.y / 2);
tabBar.setLayoutData(tabData);
FormData rightData = new FormData();
@@ -207,24 +222,12 @@ private void setTitleBarComponentLayoutData() {
rightBar.setLayoutData(rightData);
}
- private void addPage(IDashboardPage page, String title,
- String description) {
- page.setTitle(title);
- page.setDescription(description);
- page.setContext(getContext());
-
- MTabBarItem item = new MTabBarItem(tabBar, SWT.RADIO);
- item.setText(title);
- item.setData(page);
- }
-
private Control createTitleBar(Composite parent) {
titleBar = new Composite(parent, SWT.NONE);
FormLayout titleBarLayout = new FormLayout();
- titleBarLayout.marginLeft = 10;
- titleBarLayout.marginRight = 10;
- titleBarLayout.marginTop = 9;
- titleBarLayout.marginBottom = 9;
+ titleBarLayout.marginWidth = 10;
+ titleBarLayout.marginHeight = 0;
+ titleBarLayout.marginRight = 15;
titleBar.setLayout(titleBarLayout);
titleBar.setForeground(parent.getForeground());
// titleBar.setBackground(parent.getBackground());
@@ -294,34 +297,53 @@ public void handleEvent(Event event) {
private Control createRightBar(Composite composite) {
rightBar = new Composite(composite, SWT.NONE);
- GridLayoutFactory.fillDefaults().numColumns(2).applyTo(rightBar);
+ GridLayoutFactory.fillDefaults().numColumns(1).applyTo(rightBar);
+
+ createImportButton(rightBar);
+
+ return rightBar;
+ }
+
+ private void createImportButton(Composite parent) {
+ final Label importBtton = new Label(parent, SWT.NONE);
+ importBtton.setBackground(parent.getBackground());
+ importBtton.setToolTipText(
+ WorkbenchMessages.NewFileDashboardPage_Import_button);
+ importBtton.setImage((Image) resourceManager.get(
+ CathyPlugin.imageDescriptorFromPlugin(CathyPlugin.PLUGIN_ID,
+ "dashboard/new/button_import.png"))); //$NON-NLS-1$
+ GridDataFactory.swtDefaults().align(SWT.END, SWT.CENTER)
+ .grab(true, true).applyTo(importBtton);
+
+ final IAction addTemplateAction = getAddTemplateAction();
+
+ importBtton.addListener(SWT.MouseDown, new Listener() {
- ToolBarManager normalModeToolBarManager = new ToolBarManager();
- Action editModeAction = new Action(
- WorkbenchMessages.NewFileDashboardPage_GoToEditTemplateMode_label) {
@Override
- public void run() {
- normalOrEditMode = false;
- updateTitleBar();
+ public void handleEvent(Event event) {
+ addTemplateAction.run();
}
- };
- editModeAction.setToolTipText(
- WorkbenchMessages.NewFileDashboardPage_GoIntoTemplatesManagerMode_tooltip);
- normalModeToolBarManager.add(editModeAction);
- normalModeEditContainer = normalModeToolBarManager
- .createControl(rightBar);
- GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER)
- .applyTo(normalModeEditContainer);
-
- editModeContainer = createEditModeContainer(rightBar);
- GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL)
- .applyTo(editModeContainer);
+ });
- return rightBar;
+ importBtton.addMouseTrackListener(new MouseTrackAdapter() {
+
+ @Override
+ public void mouseExit(MouseEvent e) {
+ importBtton.setImage((Image) resourceManager.get(CathyPlugin
+ .imageDescriptorFromPlugin(CathyPlugin.PLUGIN_ID,
+ "dashboard/new/button_import.png"))); //$NON-NLS-1$
+ }
+
+ @Override
+ public void mouseEnter(MouseEvent e) {
+ importBtton.setImage((Image) resourceManager.get(CathyPlugin
+ .imageDescriptorFromPlugin(CathyPlugin.PLUGIN_ID,
+ "dashboard/new/button_import_hover.png"))); //$NON-NLS-1$
+ }
+ });
}
- private Control createEditModeContainer(final Composite rightBar) {
- ToolBarManager editModeToolBarManager = new ToolBarManager();
+ private IAction getAddTemplateAction() {
Action addTemplateAction = new Action(
WorkbenchMessages.NewFileDashboardPage_AddTemplates_label) {
@Override
@@ -352,43 +374,7 @@ public void run() throws Exception {
addTemplateAction.setToolTipText(
WorkbenchMessages.NewFileDashboardPage_AddTemplates_tooltip);
- deleteTemplatesAction = new Action(
- WorkbenchMessages.NewFileDashboardPage_DeleteTemplate_label) {
- @Override
- public void run() {
- deleteSelectedTemplate();
- }
- };
- deleteTemplatesAction.setToolTipText(
- WorkbenchMessages.NewFileDashboardPage_DeleteTemplate_tooltip);
- deleteTemplatesAction.setEnabled(false);
- Action exitEditModeAction = new Action(
- WorkbenchMessages.NewFileDashboardPage_ExitEditTemplatesMode_label) {
- @Override
- public void run() {
- normalOrEditMode = true;
- updateTitleBar();
- }
- };
- exitEditModeAction.setToolTipText(
- WorkbenchMessages.NewFileDashboardPage_ExitEditMode_tooltip);
- editModeToolBarManager.add(addTemplateAction);
- editModeToolBarManager.add(deleteTemplatesAction);
- editModeToolBarManager.add(exitEditModeAction);
- return editModeToolBarManager.createControl(rightBar);
- }
-
- private void deleteSelectedTemplate() {
- ITemplate template = selectedTemplate;
- if (template != null) {
- if (!MessageDialog.openConfirm(rightBar.getShell(),
- WorkbenchMessages.ConfirmDeleteTemplateDialog_title,
- NLS.bind(
- WorkbenchMessages.ConfirmDeleteTemplateDialog_message_withTemplateName,
- template.getName())))
- return;
- MindMapUI.getResourceManager().removeUserTemplate(template);
- }
+ return addTemplateAction;
}
private Control createPageContainer(Composite parent) {
@@ -416,10 +402,6 @@ private void showPage(MTabBarItem item) {
if (page != null) {
if (page.getControl() == null) {
page.createControl(pageContainer);
- if (page instanceof NewFromTemplatesDashboardPage) {
- ((NewFromTemplatesDashboardPage) page)
- .addSelectionChangedListener(this);
- }
}
layout.topControl = page.getControl();
pageContainer.layout(true);
@@ -427,25 +409,16 @@ private void showPage(MTabBarItem item) {
updateTitleBar();
}
+ getContext().setSelectionProvider(getAdapter(ISelectionProvider.class));
}
private void updateTitleBar() {
MTabBarItem item = tabBar.getSelection();
IDashboardPage page = (IDashboardPage) item.getData();
if (page instanceof NewFromTemplatesDashboardPage) {
- ((GridData) normalModeEditContainer
- .getLayoutData()).exclude = !normalOrEditMode;
- normalModeEditContainer.setVisible(normalOrEditMode);
- ((GridData) editModeContainer
- .getLayoutData()).exclude = normalOrEditMode;
- editModeContainer.setVisible(!normalOrEditMode);
- ((NewFromTemplatesDashboardPage) page).setState(normalOrEditMode);
+ rightBar.setVisible(true);
} else if (page instanceof NewFromStructuresDashboardPage) {
- normalOrEditMode = true;
- ((GridData) normalModeEditContainer.getLayoutData()).exclude = true;
- normalModeEditContainer.setVisible(false);
- ((GridData) editModeContainer.getLayoutData()).exclude = true;
- editModeContainer.setVisible(false);
+ rightBar.setVisible(false);
}
titleBar.layout(true);
}
@@ -464,29 +437,14 @@ public void setFocus() {
}
}
- public void selectionChanged(SelectionChangedEvent event) {
- ITemplate template = findTemplate(event.getSelection());
- setSelectedTemplate(template);
- }
-
- private ITemplate findTemplate(ISelection selection) {
- if (selection instanceof IStructuredSelection) {
- Object element = ((IStructuredSelection) selection)
- .getFirstElement();
- if (element instanceof ITemplate) {
- return (ITemplate) element;
- }
+ public T getAdapter(Class adapter) {
+ MTabBarItem item = tabBar.getSelection();
+ IDashboardPage page = (IDashboardPage) item.getData();
+ if (page instanceof IAdaptable) {
+ return ((IAdaptable) page).getAdapter(adapter);
}
- return null;
- }
- private void setSelectedTemplate(ITemplate template) {
- this.selectedTemplate = template;
- if (deleteTemplatesAction != null) {
- boolean enabled = selectedTemplate != null && MindMapUI
- .getResourceManager().isUserTemplate(selectedTemplate);
- deleteTemplatesAction.setEnabled(enabled);
- }
+ return null;
}
}
diff --git a/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/NewFromStructuresDashboardPage.java b/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/NewFromStructuresDashboardPage.java
index 692c60f14..7a5d1bf36 100644
--- a/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/NewFromStructuresDashboardPage.java
+++ b/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/NewFromStructuresDashboardPage.java
@@ -1,11 +1,16 @@
package org.xmind.cathy.internal.dashboard;
+import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.draw2d.geometry.Insets;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.resource.LocalResourceManager;
+import org.eclipse.jface.resource.ResourceManager;
import org.eclipse.jface.viewers.IOpenListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.OpenEvent;
import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
@@ -15,19 +20,25 @@
import org.xmind.core.style.IStyle;
import org.xmind.gef.EditDomain;
import org.xmind.gef.GEF;
+import org.xmind.gef.ui.internal.SpaceCollaborativeEngine;
import org.xmind.gef.util.Properties;
import org.xmind.ui.gallery.GalleryLayout;
import org.xmind.ui.gallery.GallerySelectTool;
import org.xmind.ui.gallery.GalleryViewer;
+import org.xmind.ui.internal.MindMapUIPlugin;
import org.xmind.ui.internal.dashboard.pages.DashboardPage;
import org.xmind.ui.mindmap.MindMapUI;
import org.xmind.ui.mindmap.WorkbookInitializer;
import org.xmind.ui.resources.ColorUtils;
-public class NewFromStructuresDashboardPage extends DashboardPage {
+@SuppressWarnings("restriction")
+public class NewFromStructuresDashboardPage extends DashboardPage
+ implements IAdaptable {
private GalleryViewer viewer;
+ private ResourceManager resources;
+
public void setFocus() {
if (viewer != null && viewer.getControl() != null
&& !viewer.getControl().isDisposed()) {
@@ -36,6 +47,9 @@ public void setFocus() {
}
public void createControl(Composite parent) {
+ resources = new LocalResourceManager(JFaceResources.getResources(),
+ parent);
+
viewer = new GalleryViewer();
EditDomain editDomain = new EditDomain();
@@ -52,12 +66,15 @@ public void createControl(Composite parent) {
properties.set(GalleryViewer.FlatFrames, true);
properties.set(GalleryViewer.ImageConstrained, true);
properties.set(GalleryViewer.Layout,
- new GalleryLayout(GalleryLayout.ALIGN_CENTER,
- GalleryLayout.ALIGN_TOPLEFT, 10, 10,
- new Insets(5, 15, 5, 15)));
+ new GalleryLayout(GalleryLayout.ALIGN_TOPLEFT,
+ GalleryLayout.ALIGN_TOPLEFT, 30, 0,
+ new Insets(10, 65, 20, 65)));
properties.set(GalleryViewer.ContentPaneBorderWidth, 1);
properties.set(GalleryViewer.ContentPaneBorderColor,
- ColorUtils.getColor("#cccccc"));
+ (Color) resources.get(ColorUtils.toDescriptor("#cccccc"))); //$NON-NLS-1$
+
+ properties.set(GalleryViewer.ContentPaneSpaceCollaborativeEngine,
+ new SpaceCollaborativeEngine());
Control control = viewer.createControl(parent);
control.setBackground(parent.getBackground());
@@ -101,10 +118,17 @@ public void run() {
return;
final StructureDescriptor structure = (StructureDescriptor) selectedElement;
- final IStyle theme = chooseTheme(viewer.getControl().getShell());
+ final IStyle theme = chooseTheme(viewer.getControl().getShell(),
+ structure.getValue());
if (theme == null)
return;
+ MindMapUIPlugin.getDefault().getUsageDataCollector()
+ .increase("CreateWorkbookCount"); //$NON-NLS-1$
+ MindMapUIPlugin.getDefault().getUsageDataCollector()
+ .increase("CreateSheetCount"); //$NON-NLS-1$
+ MindMapUIPlugin.getDefault().getUsageDataCollector()
+ .increase("StructureTypeCount:" + structure.getValue()); //$NON-NLS-1$
WorkbookInitializer initializer = WorkbookInitializer.getDefault()
.withStructureClass(structure.getValue()).withTheme(theme);
IEditorInput editorInput = MindMapUI.getEditorInputFactory()
@@ -112,12 +136,24 @@ public void run() {
getContext().openEditor(editorInput, MindMapUI.MINDMAP_EDITOR_ID);
}
- private IStyle chooseTheme(Shell shell) {
- ThemeChooserDialog dialog = new ThemeChooserDialog(shell);
+ private IStyle chooseTheme(Shell shell, String structureClass) {
+ ThemeChooserDialog dialog = new ThemeChooserDialog(shell,
+ structureClass);
int result = dialog.open();
if (result == ThemeChooserDialog.CANCEL)
return null;
return dialog.getSelectedTheme();
}
+ public T getAdapter(Class adapter) {
+ if (viewer != null) {
+ if (adapter.isAssignableFrom(viewer.getClass()))
+ return adapter.cast(viewer);
+ T obj = viewer.getAdapter(adapter);
+ if (obj != null)
+ return obj;
+ }
+ return null;
+ }
+
}
diff --git a/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/NewFromTemplatesDashboardPage.java b/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/NewFromTemplatesDashboardPage.java
index 06d198b7c..ac30a7657 100644
--- a/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/NewFromTemplatesDashboardPage.java
+++ b/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/NewFromTemplatesDashboardPage.java
@@ -1,79 +1,33 @@
package org.xmind.cathy.internal.dashboard;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.viewers.IOpenListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.OpenEvent;
import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorInput;
-import org.xmind.cathy.internal.WorkbenchMessages;
-import org.xmind.gef.EditDomain;
-import org.xmind.gef.GEF;
-import org.xmind.gef.event.KeyEvent;
-import org.xmind.gef.util.Properties;
-import org.xmind.ui.gallery.GalleryLayout;
-import org.xmind.ui.gallery.GallerySelectTool;
+import org.xmind.cathy.internal.ICathyConstants;
import org.xmind.ui.gallery.GalleryViewer;
+import org.xmind.ui.internal.MindMapUIPlugin;
import org.xmind.ui.internal.dashboard.pages.DashboardPage;
-import org.xmind.ui.internal.wizards.TemplateLabelProvider;
-import org.xmind.ui.mindmap.IResourceManager;
+import org.xmind.ui.internal.dashboard.pages.IDashboardContext;
import org.xmind.ui.mindmap.IResourceManagerListener;
import org.xmind.ui.mindmap.ITemplate;
import org.xmind.ui.mindmap.MindMapUI;
-import org.xmind.ui.resources.ColorUtils;
public class NewFromTemplatesDashboardPage extends DashboardPage
- implements IResourceManagerListener {
-
- private static final int FRAME_WIDTH = 225;
- private static final int FRAME_HEIGHT = 130;
-
- private class TemplateGallerySelectTool extends GallerySelectTool {
- @Override
- protected boolean handleKeyUp(KeyEvent ke) {
- int state = ke.getState();
- int key = ke.keyCode;
- if (state == 0 && key == SWT.DEL) {
- ISelection selection = viewer.getSelection();
- if (selection instanceof IStructuredSelection) {
- Object element = ((IStructuredSelection) selection)
- .getFirstElement();
- if (element instanceof ITemplate) {
- ITemplate template = (ITemplate) element;
- if (MindMapUI.getResourceManager()
- .isUserTemplate(template)) {
- if (MessageDialog.openConfirm(
- viewer.getControl().getShell(),
- WorkbenchMessages.ConfirmDeleteTemplateDialog_title,
- NLS.bind(
- WorkbenchMessages.ConfirmDeleteTemplateDialog_message_withTemplateName,
- template.getName()))) {
- MindMapUI.getResourceManager()
- .removeUserTemplate(template);
- }
- }
- }
- }
- }
- return super.handleKeyUp(ke);
- }
- }
+ implements IResourceManagerListener, IAdaptable {
+
+ private CategorizedTemplateViewer viewer;
- private GalleryViewer viewer;
- private boolean normalOrEditMode;
private boolean templateOpening;
public void setFocus() {
@@ -89,58 +43,69 @@ public void dispose() {
super.dispose();
}
- public void setState(boolean normalOrEditMode) {
- this.normalOrEditMode = normalOrEditMode;
- }
-
public void createControl(Composite parent) {
- viewer = new GalleryViewer();
-
- EditDomain editDomain = new EditDomain();
- editDomain.installTool(GEF.TOOL_SELECT,
- new TemplateGallerySelectTool());
- viewer.setEditDomain(editDomain);
-
- Properties properties = viewer.getProperties();
- properties.set(GalleryViewer.Horizontal, Boolean.TRUE);
- properties.set(GalleryViewer.Wrap, Boolean.TRUE);
- properties.set(GalleryViewer.TitlePlacement,
- GalleryViewer.TITLE_BOTTOM);
- properties.set(GalleryViewer.SingleClickToOpen, Boolean.TRUE);
- properties.set(GalleryViewer.SolidFrames, true);
- properties.set(GalleryViewer.FlatFrames, true);
- properties.set(GalleryViewer.ImageConstrained, true);
- properties.set(GalleryViewer.ImageStretched, true);
- properties.set(GalleryViewer.Layout,
- new GalleryLayout(GalleryLayout.ALIGN_CENTER,
- GalleryLayout.ALIGN_TOPLEFT, 10, 10,
- new Insets(5, 15, 5, 15)));
- properties.set(GalleryViewer.FrameContentSize,
- new Dimension(FRAME_WIDTH, FRAME_HEIGHT));
- properties.set(GalleryViewer.ContentPaneBorderWidth, 1);
- properties.set(GalleryViewer.ContentPaneBorderColor,
- ColorUtils.getColor("#cccccc"));
-
- Control control = viewer.createControl(parent);
- control.setBackground(parent.getBackground());
- control.setForeground(parent.getForeground());
-
- viewer.setLabelProvider(new TemplateLabelProvider());
-
- viewer.setInput(getViewerInput());
+ Composite container = new Composite(parent, SWT.NONE);
+ container.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ GridLayout layout = new GridLayout();
+ layout.marginWidth = 0;
+ layout.marginLeft = 60;
+ layout.marginRight = 0;
+ layout.marginHeight = 7;
+ container.setLayout(layout);
+
+ MindMapUIPlugin.getDefault().getUsageDataCollector()
+ .increase("ShowTemplatesCount"); //$NON-NLS-1$
+ viewer = new CategorizedTemplateViewer(container);
+ Control control = viewer.getControl();
+ control.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
viewer.addOpenListener(new IOpenListener() {
public void open(OpenEvent event) {
- if (normalOrEditMode) {
- if (!templateOpening)
- handleTemplateSelected(event.getSelection());
+ if (!templateOpening) {
+ handleTemplateSelected(event.getSelection());
+ MindMapUIPlugin.getDefault().getUsageDataCollector()
+ .increase("CreateWorkbookCount"); //$NON-NLS-1$
+ MindMapUIPlugin.getDefault().getUsageDataCollector()
+ .increase("CreateSheetCount"); //$NON-NLS-1$
+ MindMapUIPlugin.getDefault().getUsageDataCollector()
+ .increase("UseTemplatesCount"); //$NON-NLS-1$
}
}
});
MindMapUI.getResourceManager().addResourceManagerListener(this);
- setControl(control);
+ registerContextMenu(control);
+ setControl(container);
+ }
+
+ public void registerAvailableCommands() {
+ IDashboardContext context = getContext();
+
+ context.registerAvailableCommandId(
+ ICathyConstants.COMMAND_TEMPLATE_DUPLICATE);
+ context.registerAvailableCommandId(
+ ICathyConstants.COMMAND_TEMPLATE_RENAME);
+ context.registerAvailableCommandId(
+ ICathyConstants.COMMAND_TEMPLATE_DELETE);
+ }
+
+ private void registerContextMenu(Control control) {
+ getContext().registerContextMenu(control,
+ ICathyConstants.POPUP_TEMPLATE);
+
+ //add context menu for nested viewers' control.
+ Object input = viewer.getInput();
+ if (input instanceof Object[]) {
+ Object[] groups = (Object[]) viewer.getInput();
+ for (Object group : groups) {
+ GalleryViewer nestedViewer = viewer.getNestedViewer(group);
+ if (nestedViewer != null) {
+ nestedViewer.getControl().setMenu(control.getMenu());
+ }
+ }
+ }
}
public void addSelectionChangedListener(
@@ -150,31 +115,15 @@ public void addSelectionChangedListener(
}
}
- private List getViewerInput() {
- ArrayList templates = new ArrayList();
- IResourceManager resourceManager = MindMapUI.getResourceManager();
- templates.addAll(resourceManager.getSystemTemplates());
- templates.addAll(resourceManager.getUserTemplates());
- // move recently added template ahead
- Collections.reverse(templates);
- return templates;
- }
-
public void userTemplateAdded(ITemplate template) {
- if (template instanceof ITemplate) {
- if (viewer == null || viewer.getControl() == null
- || viewer.getControl().isDisposed())
- return;
- viewer.setInput(getViewerInput());
+ if (viewer != null) {
+ viewer.userTemplateAdded(template);
}
}
public void userTemplateRemoved(ITemplate template) {
- if (template instanceof ITemplate) {
- if (viewer == null || viewer.getControl() == null
- || viewer.getControl().isDisposed())
- return;
- viewer.setInput(getViewerInput());
+ if (viewer != null) {
+ viewer.userTemplateRemoved(template);
}
}
@@ -209,4 +158,15 @@ public void run() {
templateOpening = false;
}
+ public T getAdapter(Class adapter) {
+ if (viewer != null) {
+ if (adapter.isAssignableFrom(viewer.getClass()))
+ return adapter.cast(viewer);
+ T obj = viewer.getAdapter(adapter);
+ if (obj != null)
+ return obj;
+ }
+ return null;
+ }
+
}
diff --git a/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/RecentContainerLayout.java b/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/RecentContainerLayout.java
new file mode 100644
index 000000000..a5682be5e
--- /dev/null
+++ b/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/RecentContainerLayout.java
@@ -0,0 +1,106 @@
+package org.xmind.cathy.internal.dashboard;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.draw2d.AbstractHintLayout;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.PositionConstants;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Rectangle;
+
+public class RecentContainerLayout extends AbstractHintLayout {
+ private Map constraints = new HashMap();
+
+ public RecentContainerLayout() {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.draw2d.AbstractLayout#setConstraint(org.eclipse.draw2d.
+ * IFigure, java.lang.Object)
+ */
+ @Override
+ public void setConstraint(IFigure child, Object constraint) {
+ constraints.put(child, constraint);
+ super.setConstraint(child, constraint);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.draw2d.AbstractLayout#getConstraint(org.eclipse.draw2d.
+ * IFigure)
+ */
+ @Override
+ public Object getConstraint(IFigure child) {
+ Object constraint = constraints.get(child);
+ return constraint == null ? super.getConstraint(child) : constraint;
+ }
+
+ public void layout(IFigure container) {
+ Rectangle area = container.getClientArea();
+ for (Object child : container.getChildren()) {
+ IFigure figure = (IFigure) child;
+ Dimension childSize = figure.getPreferredSize(-1, -1);
+ int childWidth = Math.min(area.width, childSize.width);
+ int childHeight = Math.min(area.height, childSize.height);
+
+ int childX, childY;
+ Object constraint = getConstraint(figure);
+ if (constraint instanceof Integer) {
+ int bit = ((Integer) constraint).intValue();
+ if ((bit & PositionConstants.LEFT) != 0) {
+ childX = area.x;
+ } else if ((bit & PositionConstants.RIGHT) != 0) {
+ childX = area.x + area.width - childWidth;
+ } else if ((bit & PositionConstants.CENTER) != 0) {
+ childX = area.x + (area.width - childWidth) / 2;
+ } else {
+ childX = area.x;
+ childWidth = area.width;
+ }
+ if ((bit & PositionConstants.TOP) != 0) {
+ childY = area.y;
+ } else if ((bit & PositionConstants.BOTTOM) != 0) {
+ childY = area.y + area.height - childHeight;
+ } else if ((bit & PositionConstants.MIDDLE) != 0) {
+ childY = area.y + (area.height - childHeight) / 2;
+ } else {
+ childY = area.y;
+ childHeight = area.height;
+ }
+ } else {
+ childX = area.x;
+ childY = area.y;
+ childWidth = area.width;
+ childHeight = area.height;
+ }
+
+ figure.setBounds(
+ new Rectangle(childX, childY, childWidth, childHeight));
+ }
+ }
+
+ @Override
+ protected Dimension calculatePreferredSize(IFigure figure, int wHint,
+ int hHint) {
+ if (wHint > -1)
+ wHint = Math.max(0, wHint - figure.getInsets().getWidth());
+ if (hHint > -1)
+ hHint = Math.max(0, hHint - figure.getInsets().getHeight());
+
+ Dimension d = new Dimension();
+ List children = figure.getChildren();
+ IFigure child;
+ for (int i = 0; i < children.size(); i++) {
+ child = (IFigure) children.get(i);
+ if (!isObservingVisibility() || child.isVisible())
+ d.union(child.getPreferredSize(wHint, hHint));
+ }
+
+ d.expand(figure.getInsets().getWidth(), figure.getInsets().getHeight());
+ d.union(getBorderPreferredSize(figure));
+ return d;
+ }
+}
diff --git a/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/RecentFileBlankPage.java b/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/RecentFileBlankPage.java
new file mode 100644
index 000000000..33f7e7547
--- /dev/null
+++ b/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/RecentFileBlankPage.java
@@ -0,0 +1,81 @@
+package org.xmind.cathy.internal.dashboard;
+
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.resource.LocalResourceManager;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.xmind.cathy.internal.CathyPlugin;
+import org.xmind.cathy.internal.WorkbenchMessages;
+import org.xmind.ui.resources.ColorUtils;
+import org.xmind.ui.views.Page;
+
+public class RecentFileBlankPage extends Page {
+
+ private static final String COLOR_DESCRIPTION = "#9B9B9B"; //$NON-NLS-1$
+ private LocalResourceManager resources;
+
+ @Override
+ protected Control doCreateControl(Composite parent) {
+ final Composite composite = new Composite(parent, SWT.NONE);
+ composite.setBackground(parent.getBackground());
+ composite.setForeground(parent.getForeground());
+ GridLayoutFactory.fillDefaults().spacing(0, 0).applyTo(composite);
+
+ if (resources == null)
+ resources = new LocalResourceManager(JFaceResources.getResources(),
+ composite);
+ return createContent(composite);
+ }
+
+ private Control createContent(Composite parent) {
+ Composite panel = new Composite(parent, SWT.NONE);
+ panel.setBackground(parent.getBackground());
+ GridLayoutFactory.fillDefaults().spacing(0, 24)
+ .extendedMargins(0, 0, 0, 100).applyTo(panel);
+ GridDataFactory.fillDefaults().grab(true, true)
+ .align(SWT.CENTER, SWT.CENTER).applyTo(panel);
+
+ Label imageLabel = new Label(panel, SWT.NONE);
+ imageLabel.setImage((Image) resources.get(
+ CathyPlugin.imageDescriptorFromPlugin(CathyPlugin.PLUGIN_ID,
+ "dashboard/recent/blank_recent.png"))); //$NON-NLS-1$
+ GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.CENTER)
+ .grab(true, false).applyTo(imageLabel);
+ Point imageSize = imageLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT);
+
+ Control textArea = createTextArea(panel);
+ GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.FILL)
+ .grab(true, false).hint(imageSize.x + 140, SWT.DEFAULT)
+ .applyTo(textArea);
+
+ return parent;
+ }
+
+ private Control createTextArea(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setBackground(parent.getBackground());
+ composite.setForeground(parent.getForeground());
+ GridLayoutFactory.fillDefaults().spacing(0, 24).applyTo(composite);
+
+ Label descriptionLabel = new Label(composite, SWT.CENTER | SWT.WRAP);
+ descriptionLabel.setForeground((Color) resources
+ .get(ColorUtils.toDescriptor(COLOR_DESCRIPTION)));
+ descriptionLabel.setFont(
+ (Font) resources.get(JFaceResources.getDefaultFontDescriptor()
+ .setStyle(SWT.NORMAL).setHeight(12)));
+ descriptionLabel
+ .setText(WorkbenchMessages.RecentFileBlankPage_description);
+ GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL)
+ .grab(true, false).applyTo(descriptionLabel);
+
+ return composite;
+ }
+}
diff --git a/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/RecentFileGridDashboardPage.java b/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/RecentFileGridDashboardPage.java
new file mode 100644
index 000000000..0d89de052
--- /dev/null
+++ b/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/RecentFileGridDashboardPage.java
@@ -0,0 +1,117 @@
+package org.xmind.cathy.internal.dashboard;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IWorkbenchCommandConstants;
+import org.eclipse.ui.PlatformUI;
+import org.xmind.cathy.internal.ICathyConstants;
+import org.xmind.ui.editor.IEditorHistory;
+import org.xmind.ui.editor.IEditorHistory.IEditorHistoryListener;
+import org.xmind.ui.gallery.GalleryViewer;
+import org.xmind.ui.internal.dashboard.pages.DashboardPage;
+import org.xmind.ui.internal.dashboard.pages.IDashboardContext;
+import org.xmind.ui.views.IPage;
+import org.xmind.ui.views.PageStack;
+
+public class RecentFileGridDashboardPage extends DashboardPage
+ implements IAdaptable {
+
+ private static final String COMMAND_OPEN_SEAWIND_FILE_ID = "org.xmind.ui.seawind.command.openSeawindFile"; //$NON-NLS-1$
+
+ private static final String COMMAND_OPEN_LOCAL_FILE_ID = "org.xmind.ui.mindmap.command.openLocalFile"; //$NON-NLS-1$
+
+ private GalleryViewer viewer;
+
+ private PageStack stack;
+
+ IPage recentBlankPage;
+
+ IPage recentFileGridPage;
+
+ public void createControl(Composite parent) {
+
+ stack = new PageStack();
+ stack.createControl(parent);
+ stack.getControl().setBackground(parent.getBackground());
+
+ final IEditorHistory editorHistory = PlatformUI.getWorkbench()
+ .getService(IEditorHistory.class);
+ editorHistory.addEditorHistoryListener(new IEditorHistoryListener() {
+
+ @Override
+ public void editorHistoryChanged() {
+ if (getControl() == null || getControl().isDisposed())
+ return;
+ if (Display.getCurrent() == null)
+ return;
+ showPage(editorHistory);
+ }
+ });
+
+ //do chose which viewer will show;
+ showPage(editorHistory);
+ }
+
+ private void showPage(final IEditorHistory editorHistory) {
+ Composite composite = stack.getStackComposite();
+
+ if (editorHistory.getAllInputURIs().length == 0) {
+ if (recentBlankPage == null) {
+ recentBlankPage = new RecentFileBlankPage();
+ recentBlankPage.createControl(composite);
+ }
+ stack.showPage(recentBlankPage);
+ } else {
+ if (recentFileGridPage == null) {
+ recentFileGridPage = new RecentFileGridPage();
+ recentFileGridPage.createControl(composite);
+ viewer = recentFileGridPage.getAdapter(GalleryViewer.class);
+ }
+ stack.showPage(recentFileGridPage);
+ }
+ setControl(stack.getControl());
+ stack.setFocus();
+ }
+
+ @Override
+ public void setContext(IDashboardContext context) {
+ super.setContext(context);
+ context.registerAvailableCommandId(
+ ICathyConstants.COMMAND_RECENTFILE_PIN);
+ context.registerAvailableCommandId(
+ ICathyConstants.COMMAND_RECENTFILE_UNPIN);
+ context.registerAvailableCommandId(
+ ICathyConstants.COMMAND_RECENTFILE_CLEAR);
+ context.registerAvailableCommandId(
+ IWorkbenchCommandConstants.EDIT_DELETE);
+
+ //register command in DashboardContext
+ context.registerAvailableCommandId(COMMAND_OPEN_SEAWIND_FILE_ID);
+ context.registerAvailableCommandId(COMMAND_OPEN_LOCAL_FILE_ID);
+ }
+
+ public void setFocus() {
+ if (viewer != null && viewer.getControl() != null
+ && !viewer.getControl().isDisposed()) {
+ getContext().registerContextMenu(viewer.getControl(),
+ ICathyConstants.POPUP_RECENTFILE);
+ }
+ if (stack != null && stack.getControl() != null
+ && !stack.getControl().isDisposed()) {
+ stack.setFocus();
+ }
+ }
+
+ public T getAdapter(Class adapter) {
+ if (viewer != null) {
+ if (adapter.isAssignableFrom(viewer.getClass()))
+ return adapter.cast(viewer);
+ T obj = viewer.getAdapter(adapter);
+ if (obj != null)
+ return obj;
+ }
+ return null;
+ }
+
+}
diff --git a/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/RecentFileGridPage.java b/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/RecentFileGridPage.java
new file mode 100644
index 000000000..a7ddbe5c1
--- /dev/null
+++ b/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/RecentFileGridPage.java
@@ -0,0 +1,177 @@
+package org.xmind.cathy.internal.dashboard;
+
+import java.net.URI;
+
+import org.eclipse.core.commands.Command;
+import org.eclipse.core.commands.IParameter;
+import org.eclipse.core.commands.Parameterization;
+import org.eclipse.core.commands.ParameterizedCommand;
+import org.eclipse.core.commands.common.NotDefinedException;
+import org.eclipse.e4.core.commands.ECommandService;
+import org.eclipse.e4.core.commands.EHandlerService;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.resource.LocalResourceManager;
+import org.eclipse.jface.viewers.IOpenListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.OpenEvent;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.xmind.cathy.internal.CathyPlugin;
+import org.xmind.cathy.internal.WorkbenchMessages;
+import org.xmind.ui.gallery.GalleryViewer;
+import org.xmind.ui.resources.ColorUtils;
+import org.xmind.ui.views.Page;
+
+public class RecentFileGridPage extends Page {
+
+ private static final String COMMANDPARAMETER_OPEN_CLOUD_FILE_URI = "org.xmind.ui.seawind.commandparameter.openCloudFile.uri"; //$NON-NLS-1$
+
+ private static final String COMMAND_OPEN_SEAWIND_FILE_ID = "org.xmind.ui.seawind.command.openSeawindFile"; //$NON-NLS-1$
+
+ private static final String COMMAND_OPEN_LOCAL_FILE_ID = "org.xmind.ui.mindmap.command.openLocalFile"; //$NON-NLS-1$
+
+ private static final String COMMANDPARAMETER_OPEN_LOCAL_FILE_URI = "org.xmind.ui.mindmap.commandparameter.openLocalFile.uri"; //$NON-NLS-1$
+
+ private GalleryViewer viewer;
+
+ private LocalResourceManager resources;
+
+ @Override
+ protected Control doCreateControl(Composite parent) {
+ final Composite composite = new Composite(parent, SWT.NONE);
+ composite.setBackground(parent.getBackground());
+ composite.setForeground(parent.getForeground());
+ GridLayoutFactory.fillDefaults().spacing(0, 0).applyTo(composite);
+ GridDataFactory.fillDefaults().grab(true, true).applyTo(composite);
+
+ if (null == resources)
+ resources = new LocalResourceManager(JFaceResources.getResources(),
+ composite);
+ Composite titleBar = new Composite(composite, SWT.NONE);
+ titleBar.setBackground(
+ (Color) resources.get(ColorUtils.toDescriptor("#ececec"))); //$NON-NLS-1$
+ titleBar.setForeground(composite.getForeground());
+ GridLayoutFactory.fillDefaults().margins(10, 10).applyTo(titleBar);
+ GridData titleBarData = new GridData(SWT.FILL, SWT.FILL, true, false);
+ titleBarData.heightHint = 44;
+ titleBar.setLayoutData(titleBarData);
+
+ Label titleLabel = new Label(titleBar, SWT.NONE);
+ titleLabel.setBackground(titleBar.getBackground());
+ titleLabel.setForeground(
+ (Color) resources.get(ColorUtils.toDescriptor("#000000"))); //$NON-NLS-1$
+
+ titleLabel.setFont((Font) resources.get(
+ JFaceResources.getHeaderFontDescriptor().increaseHeight(-1)));
+
+ titleLabel.setText(WorkbenchMessages.DashboardRecentFiles_message);
+ GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER)
+ .grab(true, true).applyTo(titleLabel);
+
+ Label separator = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL);
+ separator.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ Composite panel = new Composite(composite, SWT.NONE);
+ GridLayoutFactory.fillDefaults().spacing(0, 0).applyTo(panel);
+ GridDataFactory.fillDefaults().grab(true, true).applyTo(panel);
+
+ createViewer(panel);
+ return composite;
+ }
+
+ private void createViewer(Composite parent) {
+ viewer = new RecentFileViewer(parent);
+
+ viewer.addOpenListener(new IOpenListener() {
+ public void open(OpenEvent event) {
+ handleOpenRecentFile(event.getSelection());
+ }
+ });
+ }
+
+ private void handleOpenRecentFile(ISelection selection) {
+ if (!(selection instanceof IStructuredSelection))
+ return;
+
+ Object element = ((IStructuredSelection) selection).getFirstElement();
+ if (!(element instanceof URI))
+ return;
+
+ URI uri = (URI) element;
+ if (uri.getScheme().equalsIgnoreCase("seawind")) {//$NON-NLS-1$
+ // TODO do execute command openEditor by seawind plugin
+ openCloudFile(uri);
+ } else if (uri.getScheme().equalsIgnoreCase("file")) { //$NON-NLS-1$
+ //TODO do execute command openEditor by mindmap plugin
+ openLocalFile(uri);
+ }
+ }
+
+ private void openLocalFile(final URI uri) {
+ executeCommand(COMMAND_OPEN_LOCAL_FILE_ID,
+ COMMANDPARAMETER_OPEN_LOCAL_FILE_URI, uri);
+ }
+
+ private void openCloudFile(final URI uri) {
+ executeCommand(COMMAND_OPEN_SEAWIND_FILE_ID,
+ COMMANDPARAMETER_OPEN_CLOUD_FILE_URI, uri);
+ }
+
+ private void executeCommand(String commandId, String parameter, URI uri) {
+ IWorkbenchWindow window = PlatformUI.getWorkbench()
+ .getActiveWorkbenchWindow();
+ if (window == null)
+ return;
+
+ final EHandlerService hs = window.getService(EHandlerService.class);
+ final ECommandService cs = window.getService(ECommandService.class);
+
+ if (hs == null || cs == null)
+ return;
+
+ final Command command = cs.getCommand(commandId);
+ if (command == null || !command.isDefined())
+ return;
+
+ try {
+ IParameter param = command.getParameter(parameter);
+ if (param == null)
+ return;
+
+ ParameterizedCommand pc = new ParameterizedCommand(command,
+ new Parameterization[] {
+ new Parameterization(param, uri.toString()) });
+
+ if (!hs.canExecute(pc))
+ return;
+ hs.executeHandler(pc);
+
+ } catch (NotDefinedException e) {
+ CathyPlugin.log(e, this.getClass().getName()
+ + "-->execute openLocalFileHandler or openCloudFileHandler"); //$NON-NLS-1$
+ }
+ }
+
+ @Override
+ public T getAdapter(Class adapter) {
+ if (viewer != null) {
+ if (adapter.isAssignableFrom(viewer.getClass()))
+ return adapter.cast(viewer);
+ T obj = viewer.getAdapter(adapter);
+ if (obj != null)
+ return obj;
+ }
+ return super.getAdapter(adapter);
+ }
+
+}
diff --git a/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/RecentFileListDashboardPage.java b/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/RecentFileListDashboardPage.java
deleted file mode 100644
index 0e93e4a72..000000000
--- a/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/RecentFileListDashboardPage.java
+++ /dev/null
@@ -1,130 +0,0 @@
-package org.xmind.cathy.internal.dashboard;
-
-import java.net.URI;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.layout.GridDataFactory;
-import org.eclipse.jface.layout.GridLayoutFactory;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.viewers.IOpenListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.OpenEvent;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IWorkbenchCommandConstants;
-import org.xmind.cathy.internal.ICathyConstants;
-import org.xmind.cathy.internal.WorkbenchMessages;
-import org.xmind.ui.gallery.GalleryViewer;
-import org.xmind.ui.internal.dashboard.pages.DashboardPage;
-import org.xmind.ui.internal.dashboard.pages.IDashboardContext;
-import org.xmind.ui.mindmap.MindMapUI;
-import org.xmind.ui.resources.ColorUtils;
-
-public class RecentFileListDashboardPage extends DashboardPage
- implements IAdaptable {
-
- private GalleryViewer viewer;
-
- public void createControl(Composite parent) {
- Composite composite = new Composite(parent, SWT.NONE);
- composite.setBackground(parent.getBackground());
- composite.setForeground(parent.getForeground());
- GridLayoutFactory.fillDefaults().spacing(0, 0).applyTo(composite);
-
- Composite titleBar = new Composite(composite, SWT.NONE);
-// titleBar.setBackground(composite.getBackground());
- titleBar.setBackground((Color) JFaceResources.getResources()
- .get(ColorUtils.toDescriptor("#ececec"))); //$NON-NLS-1$
- titleBar.setForeground(composite.getForeground());
- GridLayoutFactory.fillDefaults().margins(10, 10).applyTo(titleBar);
- GridData titleBarData = new GridData(SWT.FILL, SWT.FILL, true, false);
- titleBarData.heightHint = 44;
- titleBar.setLayoutData(titleBarData);
-
- Label titleLabel = new Label(titleBar, SWT.NONE);
- titleLabel.setBackground(titleBar.getBackground());
-// titleLabel.setForeground(titleBar.getForeground());
- titleLabel.setForeground((Color) JFaceResources.getResources()
- .get(ColorUtils.toDescriptor("#000000"))); //$NON-NLS-1$
- titleLabel.setFont((Font) JFaceResources.getResources().get(
- JFaceResources.getHeaderFontDescriptor().increaseHeight(-1)));
- titleLabel.setText(WorkbenchMessages.DashboardRecentFiles_message);
- GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER)
- .grab(true, true).applyTo(titleLabel);
-
- Label separator = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL);
- separator.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-
- IDashboardContext context = getContext();
- context.registerAvailableCommandId(
- ICathyConstants.COMMAND_RECENTFILE_PIN);
- context.registerAvailableCommandId(
- ICathyConstants.COMMAND_RECENTFILE_UNPIN);
- context.registerAvailableCommandId(
- ICathyConstants.COMMAND_RECENTFILE_CLEAR);
- context.registerAvailableCommandId(
- IWorkbenchCommandConstants.EDIT_DELETE);
- Control container = createViewer(composite);
- context.registerContextMenu(container,
- ICathyConstants.POPUP_RECENTFILE);
- setControl(composite);
- }
-
- protected Control createViewer(Composite parent) {
- viewer = new RecentFileViewer(parent);
- Control control = viewer.getControl();
- GridData viewerLayoutData = new GridData(SWT.FILL, SWT.FILL, true,
- true);
- control.setLayoutData(viewerLayoutData);
-
- control.setBackground(parent.getBackground());
- control.setForeground(parent.getForeground());
-
- viewer.addOpenListener(new IOpenListener() {
- public void open(OpenEvent event) {
- ISelection selection = event.getSelection();
- if (selection instanceof IStructuredSelection) {
- final Object element = ((IStructuredSelection) selection)
- .getFirstElement();
- if (element instanceof URI) {
- handleOpenRecentFile((URI) element);
- }
- }
- }
- });
-
- return control;
- }
-
- private void handleOpenRecentFile(URI uri) {
- IEditorInput input = MindMapUI.getEditorInputFactory()
- .createEditorInput(uri);
- getContext().openEditor(input, MindMapUI.MINDMAP_EDITOR_ID);
- }
-
- public void setFocus() {
- if (viewer != null && viewer.getControl() != null
- && !viewer.getControl().isDisposed()) {
- viewer.getControl().setFocus();
- }
- }
-
- public T getAdapter(Class adapter) {
- if (viewer != null) {
- if (adapter.isAssignableFrom(viewer.getClass()))
- return adapter.cast(viewer);
- T obj = viewer.getAdapter(adapter);
- if (obj != null)
- return obj;
- }
- return null;
- }
-
-}
diff --git a/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/RecentFileViewer.java b/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/RecentFileViewer.java
index 413201ce9..f5e810997 100644
--- a/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/RecentFileViewer.java
+++ b/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/RecentFileViewer.java
@@ -1,267 +1,48 @@
package org.xmind.cathy.internal.dashboard;
-import java.io.IOException;
-import java.io.InputStream;
import java.net.URI;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.resource.LocalResourceManager;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.xmind.cathy.internal.ICathyConstants;
+import org.xmind.cathy.internal.dashboard.RecentFilesGalleryPartFactory.RecentFilesFramePart;
import org.xmind.gef.EditDomain;
import org.xmind.gef.GEF;
-import org.xmind.gef.draw2d.graphics.GraphicsUtils;
-import org.xmind.gef.part.GraphicalEditPart;
-import org.xmind.gef.part.IPart;
-import org.xmind.gef.part.IPartFactory;
+import org.xmind.gef.ui.internal.SpaceCollaborativeEngine;
import org.xmind.gef.util.Properties;
import org.xmind.ui.editor.IEditorHistory;
-import org.xmind.ui.gallery.FramePart;
import org.xmind.ui.gallery.GalleryLayout;
import org.xmind.ui.gallery.GalleryNavigablePolicy;
import org.xmind.ui.gallery.GallerySelectTool;
import org.xmind.ui.gallery.GalleryViewer;
-import org.xmind.ui.internal.protocols.FilePathParser;
-import org.xmind.ui.mindmap.IMindMapImages;
-import org.xmind.ui.mindmap.MindMapUI;
import org.xmind.ui.resources.ColorUtils;
public class RecentFileViewer extends GalleryViewer {
- private static class RecentInputURILabelProvider extends LabelProvider {
-
- private Map labels;
-
- public void setLabels(Map labels) {
- this.labels = labels;
- }
-
- @Override
- public String getText(Object element) {
- if (!(element instanceof URI))
- return super.getText(element);
- URI uri = (URI) element;
- String label = labels == null ? null : labels.get(uri);
- if (label != null)
- return label;
- return uri.toString();
- }
- }
-
- private class RecentFileFigure extends Figure {
-
- private URI recentFile;
-
- private final Rectangle RECT = new Rectangle();
-
- private Image pinImage = null;
-
- public void setRecentFile(URI recentFile) {
- if (this.recentFile == recentFile)
- return;
- this.recentFile = recentFile;
- repaint();
- }
-
- public void setPinImage(Image pinImage) {
- if (pinImage == this.pinImage)
- return;
- this.pinImage = pinImage;
- repaint();
- }
-
- public void paint(Graphics graphics) {
- GraphicsUtils.fixGradientBugForCarbon(graphics, this);
- super.paint(graphics);
- }
-
- protected void paintFigure(Graphics graphics) {
- super.paintFigure(graphics);
- drawRecentFile(graphics);
- }
-
- protected void drawRecentFile(Graphics graphics) {
- if (recentFile == null)
- return;
-
- graphics.setAntialias(SWT.ON);
- graphics.setTextAntialias(SWT.ON);
-
- drawRecentFile(graphics, recentFile);
- }
-
- protected void drawRecentFile(Graphics graphics, URI recentFile) {
- Image image = getImageFromSource(recentFile);
-
- if (image != null) {
- Dimension imageSize = new Dimension(image);
- paintImage(graphics, image, imageSize,
- getImageClientArea(imageSize));
- }
-
- if (pinImage != null) {
- Rectangle ca = getClientArea();
- graphics.drawImage(pinImage, ca.x + 1, ca.y + 1);
- }
- }
-
- protected Rectangle getImageClientArea(Dimension imageSize) {
- Rectangle area = getClientArea(RECT);
- Boolean isStretched = (Boolean) RecentFileViewer.this
- .getProperty(GalleryViewer.ImageStretched, false);
- Boolean isConstrained = (Boolean) RecentFileViewer.this
- .getProperty(GalleryViewer.ImageConstrained, false);
- if (isConstrained && (isStretched || imageSize.width > area.width
- || imageSize.height > area.height)) {
- adaptAreaToRatio(area, imageSize, isStretched);
- } else {
- adaptAreaToSize(area, imageSize);
- }
- return area;
- }
-
- protected void adaptAreaToSize(Rectangle area, Dimension size) {
- area.x += (area.width - size.width) / 2;
- area.width = size.width;
- area.y += (area.height - size.height) / 2;
- area.height = size.height;
- }
-
- protected void adaptAreaToRatio(Rectangle area, Dimension ratio,
- boolean bigger) {
- int a = ratio.width * area.height;
- int b = ratio.height * area.width;
- if (bigger ? (a < b) : (a > b)) {
- int h = area.width == 0 ? 0 : b / ratio.width;
- area.y += (area.height - h) / 2;
- area.height = h;
- } else if (bigger ? (a > b) : (a < b)) {
- int w = area.height == 0 ? 0 : a / ratio.height;
- area.x += (area.width - w) / 2;
- area.width = w;
- }
- }
-
- protected void paintImage(Graphics graphics, Image image,
- Dimension imageSize, Rectangle clientArea) {
- if (clientArea.width == imageSize.width
- && clientArea.height == imageSize.height) {
- graphics.drawImage(image, clientArea.x, clientArea.y);
- } else {
- graphics.drawImage(image, 0, 0, imageSize.width,
- imageSize.height, clientArea.x, clientArea.y,
- clientArea.width, clientArea.height);
- }
- }
-
- private Image getImageFromSource(URI recentFile) {
- InputStream thumbnailData = null;
- try {
- IEditorHistory editorHistory = PlatformUI.getWorkbench()
- .getService(IEditorHistory.class);
- thumbnailData = editorHistory.loadThumbnailData(recentFile);
- if (thumbnailData != null) {
- ImageDescriptor imageDescriptor = ImageDescriptor
- .createFromImageData(new ImageData(thumbnailData));
- return JFaceResources.getResources()
- .createImage(imageDescriptor);
- }
- } catch (IOException e) {
- } finally {
- try {
- if (thumbnailData != null)
- thumbnailData.close();
- } catch (IOException e) {
- }
- }
- return MindMapUI.getImages()
- .get(IMindMapImages.THUMBNAIL_LOST, true).createImage();
- }
-
- }
-
- private class RecentFilePart extends GraphicalEditPart {
-
- public RecentFilePart(URI uri) {
- setModel(uri);
- }
-
- public URI getURI() {
- return (URI) super.getModel();
- }
-
- protected IFigure createFigure() {
- return new RecentFileFigure();
- }
-
- protected void updateView() {
- super.updateView();
- ((RecentFileFigure) getFigure()).setRecentFile(getURI());
- ((RecentFileFigure) getFigure()).setPinImage(getPinImage(getURI()));
-
- Properties properties = ((GalleryViewer) getSite().getViewer())
- .getProperties();
- Dimension size = (Dimension) properties
- .get(GalleryViewer.FrameContentSize);
- if (size != null) {
- getFigure().setPreferredSize(size);
- }
- }
-
- protected void register() {
- registerModel(getURI());
- super.register();
- }
-
- @Override
- protected void unregister() {
- super.unregister();
- unregisterModel(getURI());
- }
- }
-
- private class RecentFilePartFactory implements IPartFactory {
-
- private IPartFactory factory;
-
- public RecentFilePartFactory(IPartFactory factory) {
- this.factory = factory;
- }
-
- public IPart createPart(IPart context, Object model) {
- if (context instanceof FramePart && model instanceof URI)
- return new RecentFilePart((URI) model);
- return factory.createPart(context, model);
- }
-
- }
-
- static Image pinImage;
+ private static final int FRAME_WIDTH = 215;
+ private static final int FRAME_HEIGHT = 130;
+ private static final String COLOR_CONTENT_BORDER = "#cccccc"; //$NON-NLS-1$
private IEditorHistory editorHistory;
+ private LocalResourceManager resources;
+ private Control viewerControl;
+
public RecentFileViewer(Composite parent) {
editorHistory = PlatformUI.getWorkbench()
.getService(IEditorHistory.class);
initViewer(parent);
- createControl(parent);
registerHelper(parent.getShell());
}
@@ -308,8 +89,11 @@ public void run() {
});
}
- private void initViewer(Composite parent) {
- setPartFactory(new RecentFilePartFactory(getPartFactory()));
+ @SuppressWarnings("restriction")
+ private void initViewer(final Composite parent) {
+ if (resources == null)
+ resources = new LocalResourceManager(JFaceResources.getResources(),
+ parent);
EditDomain editDomain = new EditDomain();
editDomain.installTool(GEF.TOOL_SELECT, new GallerySelectTool());
@@ -327,25 +111,38 @@ private void initViewer(Composite parent) {
properties.set(GalleryViewer.FlatFrames, true);
properties.set(GalleryViewer.ImageConstrained, Boolean.TRUE);
properties.set(GalleryViewer.ImageStretched, Boolean.TRUE);
-
- properties.set(GalleryViewer.FrameContentSize, new Dimension(215, 130));
- properties.set(GalleryViewer.Layout,
- new GalleryLayout(GalleryLayout.ALIGN_TOPLEFT,
- GalleryLayout.ALIGN_TOPLEFT, 10, 10, new Insets(10)));
-
properties.set(GalleryViewer.ContentPaneBorderWidth, 1);
+ properties.set(GalleryViewer.CustomContentPaneDecorator, true);
properties.set(GalleryViewer.ContentPaneBorderColor,
- ColorUtils.getColor("#cccccc"));
+ resources.get(ColorUtils.toDescriptor(COLOR_CONTENT_BORDER)));
- final RecentFileListContentProvider contentProvider = new RecentFileListContentProvider();
- final RecentInputURILabelProvider labelProvider = new RecentInputURILabelProvider();
+ properties.set(GalleryViewer.FrameContentSize,
+ new Dimension(FRAME_WIDTH, FRAME_HEIGHT));
+ properties.set(GalleryViewer.Layout,
+ new GalleryLayout(GalleryLayout.ALIGN_TOPLEFT,
+ GalleryLayout.ALIGN_TOPLEFT, 30, 0,
+ new Insets(10, 65, 20, 65)));
+ properties.set(GalleryViewer.ContentPaneSpaceCollaborativeEngine,
+ new SpaceCollaborativeEngine());
+
+ final RecentFilesContentProvider contentProvider = new RecentFilesContentProvider();
+ final RecentFilesLabelProvider labelProvider = new RecentFilesLabelProvider(
+ parent);
contentProvider.addContentChangeListener(new Runnable() {
public void run() {
handleRecentFileListChanged(contentProvider, labelProvider,
true);
+ parent.layout(true);
}
});
+ viewerControl = createControl(parent);
+ viewerControl.setBackground(parent.getBackground());
+ viewerControl.setForeground(parent.getForeground());
+ viewerControl
+ .setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ setPartFactory(new RecentFilesGalleryPartFactory());
setContentProvider(contentProvider);
setLabelProvider(labelProvider);
@@ -354,7 +151,21 @@ public void run() {
editorHistory.addEditorHistoryListener(contentProvider);
setInput(editorHistory);
handleRecentFileListChanged(contentProvider, labelProvider, true);
+ }
+ @Override
+ public Control getControl() {
+ if (viewerControl != null)
+ return viewerControl;
+ return super.getControl();
+ }
+
+ private void handleRecentFileListChanged(
+ RecentFilesContentProvider contentProvider,
+ RecentFilesLabelProvider labelProvider, boolean refresh) {
+ if (refresh) {
+ setInput(getInput());
+ }
}
private void clearRecentFile() {
@@ -375,49 +186,15 @@ private void unPinRecentFile(URI fileURI) {
updateRecentFilePart(fileURI);
}
- private void handleRecentFileListChanged(
- RecentFileListContentProvider contentProvider,
- RecentInputURILabelProvider labelProvider, boolean refresh) {
- Map labels = new HashMap();
- FilePathParser.calculateFileURILabels(
- contentProvider.getRecentInputURIs(), labels);
- labelProvider.setLabels(labels);
- if (refresh) {
-// refresh();
- setInput(getInput());
- }
- }
-
- private Image getPinImage(URI uri) {
- boolean isPin = editorHistory.isPinned(uri);
- return isPin ? getPinImage() : null;
- }
-
- private static Image getPinImage() {
- if (pinImage == null) {
- ImageDescriptor desc = MindMapUI.getImages().get(IMindMapImages.PIN,
- true);
- if (desc != null) {
- try {
- pinImage = desc.createImage();
- } catch (Throwable e) {
- //e.printStackTrace();
- }
- }
- }
- return pinImage;
- }
-
private void updateRecentFilePart(URI pinURI) {
- RecentFilePart part = findRecentFilePart(pinURI);
+ RecentFilesFramePart part = findRecentFilePart(pinURI);
if (part != null)
part.update();
}
- private RecentFilePart findRecentFilePart(URI pinURI) {
+ private RecentFilesFramePart findRecentFilePart(URI pinURI) {
if (pinURI == null)
return null;
- return (RecentFilePart) getPartRegistry().getPartByModel(pinURI);
+ return (RecentFilesFramePart) getPartRegistry().getPartByModel(pinURI);
}
-
}
diff --git a/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/RecentFileListContentProvider.java b/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/RecentFilesContentProvider.java
similarity index 78%
rename from bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/RecentFileListContentProvider.java
rename to bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/RecentFilesContentProvider.java
index bc123ec54..ec9e6a664 100644
--- a/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/RecentFileListContentProvider.java
+++ b/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/RecentFilesContentProvider.java
@@ -1,6 +1,8 @@
package org.xmind.cathy.internal.dashboard;
import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
import org.eclipse.core.commands.common.EventManager;
import org.eclipse.jface.preference.IPreferenceStore;
@@ -13,11 +15,11 @@
import org.xmind.ui.editor.IEditorHistory;
import org.xmind.ui.editor.IEditorHistory.IEditorHistoryListener;
-public class RecentFileListContentProvider extends EventManager
+public class RecentFilesContentProvider extends EventManager
implements IStructuredContentProvider, IEditorHistoryListener,
IPropertyChangeListener {
- private static final int DEFAULT_ITEM_COUNT = 10;
+ private static final int DEFAULT_ITEM_COUNT = 20;
private IEditorHistory history = null;
@@ -64,18 +66,31 @@ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
public Object[] getElements(Object inputElement) {
if (inputElement != history)
return new Object[0];
- return getRecentInputURIs();
+ return getRecentInput();
}
- public URI[] getRecentInputURIs() {
+ public URI[] getRecentInput() {
if (history == null)
return new URI[0];
int itemsToShow = getItemCount();
if (itemsToShow <= 0)
return new URI[0];
- URI[] recentInputURIs = history.getRecentInputURIs(itemsToShow);
- return recentInputURIs;
+ URI[] uncheckedURIs = history.getAllInputURIs();
+ List recentInputURIs = new ArrayList();
+ int count = 0;
+ for (URI uri : uncheckedURIs) {
+ if (!recentInputURIs.contains(uri)) {
+ recentInputURIs.add(uri);
+ count++;
+ } else {
+ history.remove(uri);
+ }
+ if (count == itemsToShow)
+ break;
+ }
+
+ return recentInputURIs.toArray(new URI[recentInputURIs.size()]);
}
private int getItemCount() {
diff --git a/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/RecentFilesGalleryPartFactory.java b/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/RecentFilesGalleryPartFactory.java
new file mode 100644
index 000000000..69bbf7e50
--- /dev/null
+++ b/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/RecentFilesGalleryPartFactory.java
@@ -0,0 +1,140 @@
+package org.xmind.cathy.internal.dashboard;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.PositionConstants;
+import org.eclipse.jface.resource.FontDescriptor;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.util.Util;
+import org.eclipse.jface.viewers.IBaseLabelProvider;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.xmind.gef.IGraphicalViewer;
+import org.xmind.gef.IViewer;
+import org.xmind.gef.draw2d.ITextFigure;
+import org.xmind.gef.draw2d.RotatableWrapLabel;
+import org.xmind.gef.part.IGraphicalPart;
+import org.xmind.gef.part.IPart;
+import org.xmind.gef.util.Properties;
+import org.xmind.ui.gallery.FrameBorderLayout;
+import org.xmind.ui.gallery.FrameDecorator;
+import org.xmind.ui.gallery.FrameFigure;
+import org.xmind.ui.gallery.FramePart;
+import org.xmind.ui.gallery.GalleryPartFactory;
+import org.xmind.ui.resources.ColorUtils;
+import org.xmind.ui.resources.FontUtils;
+
+public class RecentFilesGalleryPartFactory extends GalleryPartFactory {
+ public static class RecentFilesFramePart extends FramePart {
+ RecentFilesFrameFigure figure;
+
+ public RecentFilesFramePart(Object model) {
+ super(model);
+ setDecorator(RecentFilesFrameDecorator.DEFAULT);
+ }
+
+ @Override
+ protected IFigure createFigure() {
+ figure = new RecentFilesFrameFigure();
+ Properties properties = getSite().getViewer().getProperties();
+ boolean useAdvancedRenderer = properties.getBoolean(
+ IGraphicalViewer.VIEWER_RENDER_TEXT_AS_PATH, false);
+ figure.setTitleRenderStyle(useAdvancedRenderer
+ ? RotatableWrapLabel.ADVANCED : RotatableWrapLabel.NORMAL);
+
+ return figure;
+ }
+
+ @Override
+ protected void updateChildren() {
+ super.updateChildren();
+ boolean isSelected = figure.isSelected();
+ if (isSelected) {
+ figure.setForegroundColor(ColorConstants.white);
+ figure.subTitle.setForegroundColor(ColorConstants.white);
+ }
+ }
+ }
+
+ private static class RecentFilesFrameDecorator extends FrameDecorator {
+
+ public static final RecentFilesFrameDecorator DEFAULT = new RecentFilesFrameDecorator();
+
+ @Override
+ public void decorate(IGraphicalPart part, IFigure figure) {
+ super.decorate(part, figure);
+
+ IFigure f = part.getFigure();
+ Object model = part.getModel();
+
+ IViewer viewer = part.getSite().getViewer();
+ IBaseLabelProvider labelProvider = viewer
+ .getAdapter(IBaseLabelProvider.class);
+
+ if (f instanceof RecentFilesFrameFigure
+ && labelProvider instanceof RecentFilesLabelProvider) {
+ decorateSubTitle(((RecentFilesFrameFigure) f).getSubTitle(),
+ model, (RecentFilesLabelProvider) labelProvider);
+ }
+ }
+
+ private void decorateSubTitle(ITextFigure subTitle, Object model,
+ RecentFilesLabelProvider labelProvider) {
+ if (model == null)
+ return;
+ String text = labelProvider.getSubtitle(model);
+ if (text == null)
+ return;
+
+ subTitle.setText(text);
+ subTitle.setForegroundColor((Color) JFaceResources.getResources()
+ .get(ColorUtils.toDescriptor("#8f8f8f"))); //$NON-NLS-1$
+ Font countFont = subTitle.getFont();
+ if (countFont != null) {
+ FontData[] fontData = countFont.getFontData();
+ FontData[] newFontData = FontUtils.newHeight(fontData,
+ Util.isMac() ? 9 : 7);
+ subTitle.setFont((Font) JFaceResources.getResources()
+ .get(FontDescriptor.createFrom(newFontData)));
+ }
+ }
+ }
+
+ private static class RecentFilesFrameFigure extends FrameFigure {
+
+ private RotatableWrapLabel subTitle;
+
+ Color subTitleColor = (Color) JFaceResources.getResources()
+ .get(ColorUtils.toDescriptor("#8f8f8f")); //$NON-NLS-1$
+
+ public RecentFilesFrameFigure() {
+ super();
+
+ subTitle = new RotatableWrapLabel(RotatableWrapLabel.NORMAL);
+ subTitle.setTextAlignment(PositionConstants.CENTER);
+ subTitle.setEnabled(false);
+ subTitle.setAbbreviated(true);
+ subTitle.setForegroundColor(subTitleColor);
+ getTitleContainer().add(subTitle, FrameBorderLayout.BOTTOM);
+
+ }
+
+ public ITextFigure getSubTitle() {
+ return subTitle;
+ }
+
+ @Override
+ public void setSelected(boolean selected) {
+ super.setSelected(selected);
+ subTitle.setForegroundColor(
+ selected ? ColorConstants.white : subTitleColor);
+ }
+ }
+
+ @Override
+ protected IPart createFramePart(IPart parent, Object model) {
+ return new RecentFilesFramePart(model);
+ }
+
+}
diff --git a/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/RecentFilesLabelProvider.java b/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/RecentFilesLabelProvider.java
new file mode 100644
index 000000000..d3925b3fc
--- /dev/null
+++ b/bundles/org.xmind.cathy/src/org/xmind/cathy/internal/dashboard/RecentFilesLabelProvider.java
@@ -0,0 +1,241 @@
+package org.xmind.cathy.internal.dashboard;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.sql.Date;
+import java.text.DateFormat;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.PositionConstants;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Insets;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.resource.LocalResourceManager;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.SWTException;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.PlatformUI;
+import org.xmind.cathy.internal.CathyPlugin;
+import org.xmind.cathy.internal.WorkbenchMessages;
+import org.xmind.gef.draw2d.SizeableImageFigure;
+import org.xmind.ui.editor.IEditorHistory;
+import org.xmind.ui.editor.IEditorHistoryItem;
+import org.xmind.ui.gallery.GalleryViewer;
+import org.xmind.ui.gallery.IDecorationContext;
+import org.xmind.ui.gallery.ILabelDecorator;
+import org.xmind.ui.mindmap.IMindMapImages;
+import org.xmind.ui.mindmap.MindMapUI;
+
+public class RecentFilesLabelProvider extends LabelProvider
+ implements ILabelDecorator {
+
+ Image pinImage;
+
+ protected static class RecentFrameContentLayout
+ extends RecentContainerLayout {
+
+ private IDecorationContext context;
+
+ public RecentFrameContentLayout(IDecorationContext context) {
+ this.context = context;
+ }
+
+ @Override
+ protected Dimension calculatePreferredSize(IFigure figure, int wHint,
+ int hHint) {
+ if (context != null) {
+ Insets insets = figure.getInsets();
+ Dimension contentSize = (Dimension) context
+ .getProperty(GalleryViewer.FrameContentSize, null);
+ if (contentSize != null)
+ return new Dimension(contentSize.width + insets.getWidth(),
+ contentSize.height + insets.getHeight());
+ }
+ return super.calculatePreferredSize(figure, wHint, hHint);
+ }
+ }
+
+ protected static final String COLOR_NONEXISTING_WORKBOOK_COVER = "#DDDDDD"; //$NON-NLS-1$
+ protected static final String COLOR_NONEXISTING_WORKBOOK_TEXT = "#CCCCCC"; //$NON-NLS-1$
+
+ private LocalResourceManager resources;
+ private IEditorHistory editorHistory;
+ private Map