/* ****************************************************************************** * Copyright (c) 2006-2016 XMind Ltd. and others. * * This file is a part of XMind 3. XMind releases 3 and * above are dual-licensed under the Eclipse Public License (EPL), * which is available at http://www.eclipse.org/legal/epl-v10.html * and the GNU Lesser General Public License (LGPL), * which is available at http://www.gnu.org/licenses/lgpl.html * See http://www.xmind.net/license.html for details. * * Contributors: * XMind Ltd. - initial API and implementation *******************************************************************************/ /** * */ package org.xmind.ui.internal.dialogs; import java.util.List; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.resource.FontDescriptor; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.resource.LocalResourceManager; import org.eclipse.jface.resource.ResourceManager; 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.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.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Widget; import org.xmind.ui.internal.RegistryConstants; import org.xmind.ui.internal.ShareOption; import org.xmind.ui.internal.ShareOptionRegistry; import org.xmind.ui.resources.ColorUtils; import org.xmind.ui.resources.FontUtils; /** * @author Frank Shaka * @author Shawn Liu * @since 3.6.50 */ public class ShareDialog extends Dialog { private static final String ID_KEY = "org.xmind.share.option.id"; //$NON-NLS-1$ private static final String COLOR_BACKGROUND = "#FFFFFF"; //$NON-NLS-1$ private static final String COLOR_SEPARATOR = "#D9D9D9"; //$NON-NLS-1$ private static final String COLOR_TEXT = "#555555"; //$NON-NLS-1$ private ShareOptionRegistry optionRegistry; private ShareOption selectedOption; private ResourceManager resources; private Listener eventHandler = new Listener() { public void handleEvent(Event event) { handleWidgetEvent(event); } }; public ShareDialog(Shell parentShell, ShareOptionRegistry optionRegistry) { super(parentShell); this.optionRegistry = optionRegistry; this.selectedOption = null; setBlockOnOpen(true); } /** * @return the selectedOption */ public ShareOption getSelectedOption() { return selectedOption; } /* * (non-Javadoc) * @see org.eclipse.jface.dialogs.Dialog#create() */ @Override public void create() { super.create(); getShell().setText(DialogMessages.ShareDialog_dialog_title); } /* * (non-Javadoc) * @see * org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets. * Shell) */ @Override protected void configureShell(Shell newShell) { super.configureShell(newShell); resources = new LocalResourceManager(JFaceResources.getResources(), newShell); } @Override protected Control createButtonBar(Composite parent) { return null; } @Override protected Control createDialogArea(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); composite.setLayoutData(new GridData(GridData.FILL_BOTH)); composite.setBackground((Color) resources .get(ColorUtils.toDescriptor(COLOR_BACKGROUND))); GridLayout layout = new GridLayout(); layout.marginHeight = 0; layout.marginWidth = 0; layout.verticalSpacing = 0; layout.horizontalSpacing = 0; composite.setLayout(layout); applyDialogFont(composite); createTopSection(composite); createSeparator(composite); createBottomSection(composite); return composite; } private void createTopSection(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); composite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); composite.setBackground(parent.getBackground()); composite.setForeground(parent.getForeground()); GridLayout layout = new GridLayout(3, true); layout.marginWidth = 31; layout.marginHeight = 26; layout.marginTop = 10; layout.horizontalSpacing = 20; composite.setLayout(layout); List<ShareOption> options = optionRegistry .getOptionsByCategory(RegistryConstants.VAL_CATEGORY_POPULAR); for (ShareOption option : options) { createShareItem(composite, option.getLabel(), (Image) resources.get(option.getImage()), option.getId(), 3, 8); } } private void createSeparator(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); GridData layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false); composite.setLayoutData(layoutData); composite.setBackground(parent.getBackground()); GridLayout layout = new GridLayout(1, false); layout.marginHeight = 0; layout.marginWidth = 0; composite.setLayout(layout); Composite separator = new Composite(composite, SWT.NONE); GridData layoutData2 = new GridData(SWT.FILL, SWT.CENTER, true, false); separator.setLayoutData(layoutData2); layoutData2.heightHint = 1; separator.setBackground((Color) resources .get(ColorUtils.toDescriptor(COLOR_SEPARATOR))); separator.setLayout(new GridLayout()); } private void createBottomSection(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); composite .setLayoutData(new GridData(SWT.FILL, SWT.BOTTOM, true, false)); composite.setBackground(parent.getBackground()); composite.setForeground(parent.getForeground()); GridLayout layout = new GridLayout(4, true); layout.marginWidth = 22; layout.marginHeight = 28; layout.marginBottom = 16; layout.horizontalSpacing = 38; layout.verticalSpacing = 24; composite.setLayout(layout); List<ShareOption> options = optionRegistry .getOptionsByCategory(RegistryConstants.VAL_CATEGORY_NORMAL); for (ShareOption option : options) { createShareItem(composite, option.getLabel(), (Image) resources.get(option.getImage()), option.getId(), 0, 5); } } private Control createShareItem(Composite parent, String text, Image image, String id, int relativeHeight, int verticalSpacing) { Composite composite = new Composite(parent, SWT.NONE); composite.setLayoutData(new GridData(SWT.CENTER, SWT.TOP, true, false)); composite.setBackground(parent.getBackground()); composite.setForeground(parent.getForeground()); GridLayout layout = new GridLayout(1, false); layout.marginHeight = 0; layout.marginWidth = 0; layout.verticalSpacing = verticalSpacing; composite.setLayout(layout); Label imageLabel = new Label(composite, SWT.NONE); imageLabel.setBackground(composite.getBackground()); imageLabel .setLayoutData(new GridData(SWT.CENTER, SWT.TOP, false, false)); imageLabel.setImage(image); Label textLabel = new Label(composite, SWT.WRAP); textLabel.setBackground(composite.getBackground()); GridData layoutData = new GridData(SWT.CENTER, SWT.TOP, false, false); layoutData.widthHint = image.getBounds().width + 20; textLabel.setLayoutData(layoutData); textLabel.setForeground( (Color) resources.get(ColorUtils.toDescriptor(COLOR_TEXT))); textLabel.setAlignment(SWT.CENTER); textLabel.setFont((Font) resources .get(FontDescriptor.createFrom(FontUtils.relativeHeight( textLabel.getFont().getFontData(), relativeHeight)))); textLabel.setText(text); composite.setCursor( parent.getDisplay().getSystemCursor(SWT.CURSOR_HAND)); imageLabel.setCursor( parent.getDisplay().getSystemCursor(SWT.CURSOR_HAND)); textLabel.setCursor( parent.getDisplay().getSystemCursor(SWT.CURSOR_HAND)); //add mouse down event composite.setData(ID_KEY, id); imageLabel.setData(ID_KEY, id); textLabel.setData(ID_KEY, id); hookWidget(composite, SWT.MouseDown); hookWidget(imageLabel, SWT.MouseDown); hookWidget(textLabel, SWT.MouseDown); return composite; } private void hookWidget(Widget widget, int eventType) { widget.addListener(eventType, eventHandler); } private void handleWidgetEvent(Event event) { String id = (String) event.widget.getData(ID_KEY); if (id == null) return; selectedOption = optionRegistry.getOptionById(id); if (selectedOption == null) return; okPressed(); } }