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.IAction; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.resource.ColorDescriptor; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.resource.LocalResourceManager; import org.eclipse.jface.resource.ResourceManager; import org.eclipse.jface.util.SafeRunnable; import org.eclipse.jface.util.Util; 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.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.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.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 IAdaptable { private class SegmentBarStyleProvider extends StyleProvider { @Override public Font getFont(Object widget, String key) { if (widget instanceof MTabBarItem) { if (TEXT.equals(key)) return (Font) resourceManager .get(JFaceResources.getDefaultFontDescriptor() .setHeight(Util.isMac() ? 10 : 12)); } return super.getFont(widget, key); } @Override public int getWidth(Object widget, String key, int defaultValue) { if (widget instanceof MTabBarItem) { if (key == null) return 100; } else if (widget instanceof MTabBar) { if (BORDER.equals(key)) return 1; if (SEPARATOR.equals(key)) return 1; if (CORNER.equals(key)) return 6; } return super.getWidth(widget, key, defaultValue); } @Override public int getHeight(Object widget, String key, int defaultValue) { if (widget instanceof MTabBarItem) { //FIXME if (key == null) return 26; } else if (widget instanceof MTabBar) { if (BORDER.equals(key)) return 1; if (SEPARATOR.equals(key)) return 1; if (CORNER.equals(key)) return 6; } return super.getHeight(widget, key, defaultValue); } @Override public int getPosition(Object widget, String key, int defaultValue) { if (widget instanceof MTabBarItem) { if (TEXT.equals(key)) return SWT.BOTTOM; } return super.getPosition(widget, key, defaultValue); } @Override public Color getColor(Object widget, String key) { if (widget instanceof MTabBarItem) { MTabBarItem item = (MTabBarItem) widget; if (FILL.equals(key)) { if (item.isSelected()) return (Color) resourceManager.get(ColorDescriptor .createFrom(ColorUtils.toRGB("#6B6A6B"))); //$NON-NLS-1$ } else if (TEXT.equals(key)) { if (item.isSelected()) return (Color) resourceManager.get(ColorDescriptor .createFrom(ColorUtils.toRGB("#FFFFFF"))); //$NON-NLS-1$ return (Color) resourceManager.get(ColorDescriptor .createFrom(ColorUtils.toRGB("#2B2A2B"))); //$NON-NLS-1$ } } else if (widget instanceof MTabBar) { if (BORDER.equals(key) || SEPARATOR.equals(key)) return (Color) resourceManager.get(ColorDescriptor .createFrom(ColorUtils.toRGB("#A6A6A6"))); //$NON-NLS-1$ } return super.getColor(widget, key); } @Override public int getAlpha(Object widget, String key, int defaultValue) { if (widget instanceof MTabBar) { if (BORDER.equals(key)) return 0xC0; } return super.getAlpha(widget, key, defaultValue); } } private Control control = null; private ResourceManager resourceManager = null; private Composite titleBar = null; private Composite rightBar = null; private MTabBar tabBar = null; private Composite pageContainer = null; private List<IDashboardPage> pages = new ArrayList<IDashboardPage>(); @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); this.resourceManager = new LocalResourceManager( JFaceResources.getResources(), composite); composite.setBackground(parent.getBackground()); composite.setForeground(parent.getForeground()); GridLayoutFactory.fillDefaults().spacing(0, 0).numColumns(1) .applyTo(composite); Control titleBar = createTitleBar(composite); GridDataFactory.fillDefaults().hint(SWT.DEFAULT, 44) .align(SWT.FILL, SWT.FILL).grab(true, false).applyTo(titleBar); Label separator = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL); GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL) .grab(true, false).applyTo(separator); Control pageContainer = createPageContainer(composite); GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL) .grab(true, true).applyTo(pageContainer); this.control = composite; for (IDashboardPage page : pages) { MTabBarItem item = new MTabBarItem(tabBar, SWT.RADIO); item.setText(page.getTitle()); item.setData(page); } setTitleBarComponentLayoutData(); showPage(tabBar.getItem(0)); } private void setTitleBarComponentLayoutData() { FormData tabData = new FormData(); // A side can't be attached to parent, so we have to get the size first. // 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(50, -tabSize.y / 2); tabData.bottom = new FormAttachment(50, tabSize.y / 2); tabBar.setLayoutData(tabData); FormData rightData = new FormData(); rightData.top = new FormAttachment(0, 0); rightData.right = new FormAttachment(100, 0); rightData.bottom = new FormAttachment(100, 0); rightBar.setLayoutData(rightData); } private Control createTitleBar(Composite parent) { titleBar = new Composite(parent, SWT.NONE); FormLayout titleBarLayout = new FormLayout(); titleBarLayout.marginWidth = 10; titleBarLayout.marginHeight = 0; titleBarLayout.marginRight = 15; titleBar.setLayout(titleBarLayout); titleBar.setForeground(parent.getForeground()); // titleBar.setBackground(parent.getBackground()); titleBar.setBackground((Color) JFaceResources.getResources() .get(ColorUtils.toDescriptor("#ececec"))); //$NON-NLS-1$ Control titleLabel = createLeftTitleBarControl(titleBar); FormData leftData = new FormData(); leftData.top = new FormAttachment(0, 0); leftData.left = new FormAttachment(0, 0); leftData.bottom = new FormAttachment(100, 0); titleLabel.setLayoutData(leftData); createCentralContainer(titleBar); // FormData tabData = new FormData(); // // A side can't be attached to parent, so we have to get the size first. // // 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); // tabBar.setLayoutData(tabData); createRightBar(titleBar); // FormData rightData = new FormData(); // rightData.top = new FormAttachment(0, 0); // rightData.right = new FormAttachment(100, 0); // rightData.bottom = new FormAttachment(100, 0); // rightBar.setLayoutData(rightData); return titleBar; } private Control createLeftTitleBarControl(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); composite.setBackground(parent.getBackground()); composite.setForeground(parent.getForeground()); GridLayoutFactory.fillDefaults().numColumns(2).spacing(3, 0) .applyTo(composite); Label titleNameLabel = new Label(composite, SWT.WRAP); titleNameLabel.setBackground(composite.getBackground()); titleNameLabel.setForeground(composite.getForeground()); titleNameLabel.setFont((Font) JFaceResources.getResources().get( JFaceResources.getHeaderFontDescriptor().increaseHeight(-1))); titleNameLabel.setText( WorkbenchMessages.NewFileDashboardPage_leftTitleBar_text); GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.CENTER) .grab(true, true).applyTo(titleNameLabel); return composite; } private Control createCentralContainer(Composite parent) { tabBar = new MTabBar(parent, SWT.NONE); tabBar.setBackground( parent.getDisplay().getSystemColor(SWT.COLOR_TRANSPARENT)); tabBar.setStyleProvider(new SegmentBarStyleProvider()); tabBar.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { showPage((MTabBarItem) event.item); } }); return tabBar; } private Control createRightBar(Composite composite) { rightBar = new Composite(composite, SWT.NONE); 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() { @Override public void handleEvent(Event event) { addTemplateAction.run(); } }); 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 IAction getAddTemplateAction() { Action addTemplateAction = new Action( WorkbenchMessages.NewFileDashboardPage_AddTemplates_label) { @Override public void run() { FileDialog dialog = new FileDialog(getShell(), SWT.OPEN); String ext = "*" + MindMapUI.FILE_EXT_TEMPLATE; //$NON-NLS-1$ dialog.setFilterExtensions(new String[] { ext }); dialog.setFilterNames(new String[] { NLS.bind("{0} ({1})", //$NON-NLS-1$ WorkbenchMessages.NewFileDashboardPage_TemplateFilterName_label, ext) }); String path = dialog.open(); if (path == null) return; final File templateFile = new File(path); if (templateFile != null && templateFile.exists()) { SafeRunner.run(new SafeRunnable() { public void run() throws Exception { MindMapUI.getResourceManager() .addUserTemplateFromWorkbookURI( templateFile.toURI()); } }); } } }; addTemplateAction.setToolTipText( WorkbenchMessages.NewFileDashboardPage_AddTemplates_tooltip); return addTemplateAction; } private Control createPageContainer(Composite parent) { pageContainer = new Composite(parent, SWT.NONE); pageContainer.setBackground(parent.getBackground()); pageContainer.setLayout(new StackLayout()); return pageContainer; } private void showPage(MTabBarItem item) { if (pageContainer == null || pageContainer.isDisposed()) return; StackLayout layout = (StackLayout) pageContainer.getLayout(); if (item == null) { layout.topControl = null; pageContainer.layout(true); return; } IDashboardPage page = (IDashboardPage) item.getData(); if (page != null) { if (page.getControl() == null) { page.createControl(pageContainer); } layout.topControl = page.getControl(); pageContainer.layout(true); updateTitleBar(); } getContext().setSelectionProvider(getAdapter(ISelectionProvider.class)); } private void updateTitleBar() { MTabBarItem item = tabBar.getSelection(); IDashboardPage page = (IDashboardPage) item.getData(); if (page instanceof NewFromTemplatesDashboardPage) { rightBar.setVisible(true); } else if (page instanceof NewFromStructuresDashboardPage) { rightBar.setVisible(false); } titleBar.layout(true); } public Control getControl() { return this.control; } public void setFocus() { MTabBarItem item = tabBar.getSelection(); if (item != null) { IDashboardPage page = (IDashboardPage) item.getData(); if (page != null) { page.setFocus(); } } } public <T> T getAdapter(Class<T> adapter) { MTabBarItem item = tabBar.getSelection(); IDashboardPage page = (IDashboardPage) item.getData(); if (page instanceof IAdaptable) { return ((IAdaptable) page).getAdapter(adapter); } return null; } }