diff options
author | Chris Goldthorpe | 2008-02-07 16:36:56 +0000 |
---|---|---|
committer | Chris Goldthorpe | 2008-02-07 16:36:56 +0000 |
commit | bac8fc048fd65a58b234887d5ce7fbf59380e98a (patch) | |
tree | 330a5ec07e4a1cf3f7785793b5ffec20fcd943d2 /org.eclipse.ui.intro.universal | |
parent | 299f3b336ff0e25c77aa317a7815d137c02c3925 (diff) | |
download | eclipse.platform.ua-bac8fc048fd65a58b234887d5ce7fbf59380e98a.tar.gz eclipse.platform.ua-bac8fc048fd65a58b234887d5ce7fbf59380e98a.tar.xz eclipse.platform.ua-bac8fc048fd65a58b234887d5ce7fbf59380e98a.zip |
Diffstat (limited to 'org.eclipse.ui.intro.universal')
6 files changed, 1256 insertions, 1122 deletions
diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/CustomizationContentsArea.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/CustomizationContentsArea.java new file mode 100644 index 000000000..9eca2ff3e --- /dev/null +++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/CustomizationContentsArea.java @@ -0,0 +1,1170 @@ +/******************************************************************************* + * Copyright (c) 2006, 2008 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.ui.internal.intro.universal; + +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.StringTokenizer; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.IProduct; +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.Preferences; +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.IMenuListener; +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.MenuManager; +import org.eclipse.jface.action.Separator; +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.jface.viewers.CellEditor; +import org.eclipse.jface.viewers.CheckStateChangedEvent; +import org.eclipse.jface.viewers.CheckboxTableViewer; +import org.eclipse.jface.viewers.ComboBoxCellEditor; +import org.eclipse.jface.viewers.ICellModifier; +import org.eclipse.jface.viewers.ICheckStateListener; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.IStructuredContentProvider; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.ITableLabelProvider; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerComparator; +import org.eclipse.jface.viewers.ViewerDropAdapter; +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.BusyIndicator; +import org.eclipse.swt.dnd.DND; +import org.eclipse.swt.dnd.DragSourceEvent; +import org.eclipse.swt.dnd.DragSourceListener; +import org.eclipse.swt.dnd.Transfer; +import org.eclipse.swt.dnd.TransferData; +import org.eclipse.swt.events.PaintEvent; +import org.eclipse.swt.events.PaintListener; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Canvas; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.FileDialog; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.TabFolder; +import org.eclipse.swt.widgets.TabItem; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.swt.widgets.TableItem; +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.internal.intro.impl.IntroPlugin; +import org.eclipse.ui.internal.intro.impl.model.IntroModelRoot; +import org.eclipse.ui.internal.intro.universal.util.BundleUtil; +import org.eclipse.ui.internal.intro.universal.util.ImageUtil; +import org.eclipse.ui.internal.intro.universal.util.Log; +import org.eclipse.ui.intro.IIntroManager; +import org.eclipse.ui.intro.IIntroPart; +import org.eclipse.ui.intro.config.CustomizableIntroPart; +import org.eclipse.ui.intro.config.IIntroURL; +import org.eclipse.ui.intro.config.IntroURLFactory; +import org.osgi.framework.Bundle; + + +public class CustomizationContentsArea { + + private static final String INTRO_ROOT_PAGES = "INTRO_ROOT_PAGES"; //$NON-NLS-1$ + private static final String INTRO_DATA = "INTRO_DATA"; //$NON-NLS-1$ + private static final String INTRO_THEME = "INTRO_THEME"; //$NON-NLS-1$ + private static final String NO_ROOT_PAGES = "no_root_pages"; //$NON-NLS-1$ + private TabFolder tabFolder; + private String firstPageId; + private Composite pageContainer; + private TableViewer themes; + private TableViewer available; + private TableViewer topLeft; + private TableViewer topRight; + private TableViewer bottomLeft; + private TableViewer bottomRight; + private CheckboxTableViewer rootPages; + private ArrayList introRootPages = new ArrayList(); + private ArrayList themeList = new ArrayList(); + private IntroTheme introTheme; + private String introThemeId; + private IntroData introData; + private Canvas themePreview; + private TableContentProvider contentProvider; + private TableLabelProvider labelProvider; + private Button applyToAll; + private Image extensionImage; + private Image themeImage; + private Image ihighImage; + private Image ilowImage; + private Image inewImage; + private Image icalloutImage; + private Shell shell; + private static final Transfer[] TRANSFER_TYPES = new Transfer[] { ExtensionDataTransfer.getInstance() }; + + + private static final RootPage ROOT_PAGE_TABLE[] = new RootPage[] { + new RootPage(IUniversalIntroConstants.ID_OVERVIEW, + Messages.WelcomeCustomizationPreferencePage_overview, + Messages.WelcomeCustomizationPreferencePage_NoMnemonic_overview), + new RootPage(IUniversalIntroConstants.ID_FIRSTSTEPS, + Messages.WelcomeCustomizationPreferencePage_firststeps, + Messages.WelcomeCustomizationPreferencePage_NoMnemonic_firststeps), + new RootPage(IUniversalIntroConstants.ID_TUTORIALS, + Messages.WelcomeCustomizationPreferencePage_tutorials, + Messages.WelcomeCustomizationPreferencePage_NoMnemonic_tutorials), + new RootPage(IUniversalIntroConstants.ID_SAMPLES, + Messages.WelcomeCustomizationPreferencePage_samples, + Messages.WelcomeCustomizationPreferencePage_NoMnemonic_samples), + new RootPage(IUniversalIntroConstants.ID_WHATSNEW, + Messages.WelcomeCustomizationPreferencePage_whatsnew, + Messages.WelcomeCustomizationPreferencePage_NoMnemonic_whatsnew), + new RootPage(IUniversalIntroConstants.ID_WEBRESOURCES, + Messages.WelcomeCustomizationPreferencePage_webresources, + Messages.WelcomeCustomizationPreferencePage_NoMnemonic_webresources), + new RootPage(IUniversalIntroConstants.ID_MIGRATE, + Messages.WelcomeCustomizationPreferencePage_migrate, + Messages.WelcomeCustomizationPreferencePage_NoMnemonic_migrate) }; + + static class RootPage { + + public String id; + public String name; + public String nameNoMnemonic; + + public RootPage(String id, String name, String nameNoMnemonic) { + this.id = id; + this.name = name; + this.nameNoMnemonic = nameNoMnemonic; + } + + public String getName() { + return name; + } + + public String getNameNoMnemonic() { + return nameNoMnemonic; + } + + public boolean equals(Object obj) { + if (obj == this) + return true; + if (obj == null) + return false; + if (obj instanceof RootPage) { + RootPage page = (RootPage) obj; + return page.id.equals(id) && page.name.equals(name); + } + return false; + } + + public String toString() { + return name; + } + } + + class TableContentProvider implements IStructuredContentProvider { + + public Object[] getElements(Object inputElement) { + if (inputElement == ROOT_PAGE_TABLE) + return ROOT_PAGE_TABLE; + if (inputElement instanceof GroupData) { + return ((GroupData) inputElement).getChildren(); + } + if (inputElement == themes) { + return themeList.toArray(); + } + return new Object[0]; + } + + public void dispose() { + } + + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + } + } + + class TableDragSourceListener implements DragSourceListener { + + TableViewer viewer; + BaseData[] sel; + + public TableDragSourceListener(TableViewer viewer) { + this.viewer = viewer; + } + + public void dragStart(DragSourceEvent event) { + IStructuredSelection ssel = (IStructuredSelection) viewer.getSelection(); + if (ssel.size() > 0) { + event.doit = true; + } else { + event.doit = false; + } + }; + + public void dragSetData(DragSourceEvent event) { + IStructuredSelection ssel = (IStructuredSelection) viewer.getSelection(); + BaseData[] array = new BaseData[ssel.size()]; + int i = 0; + for (Iterator iter = ssel.iterator(); iter.hasNext();) { + array[i++] = (BaseData) iter.next(); + } + event.data = array; + sel = array; + } + + public void dragFinished(DragSourceEvent event) { + if (event.detail == DND.DROP_MOVE) { + GroupData gd = (GroupData) viewer.getInput(); + for (int i = 0; i < sel.length; i++) { + BaseData ed = sel[i]; + gd.remove(ed); + } + viewer.refresh(); + updateColumnSizes(viewer); + } + sel = null; + } + } + + CustomizationContentsArea() { + } + + class TableDropTargetListener extends ViewerDropAdapter { + + public TableDropTargetListener(TableViewer viewer) { + super(viewer); + } + + public boolean performDrop(Object data) { + BaseData target = (BaseData) getCurrentTarget(); + int loc = getCurrentLocation(); + GroupData gd = (GroupData) getViewer().getInput(); + if (gd == null) + gd = createTargetGd(getViewer()); + BaseData[] sel = (BaseData[]) data; + + int index = target != null ? gd.getIndexOf(target) : -1; + int startingIndex = getStartIndex(gd, sel); + if (target != null) { + if (loc == LOCATION_AFTER + || (loc == LOCATION_ON && startingIndex != -1 && startingIndex < index)) + index++; + else if (index > 0 && loc == LOCATION_BEFORE) + index--; + } + + for (int i = 0; i < sel.length; i++) { + BaseData ed = sel[i]; + if (index == -1) + gd.add(ed); + else + gd.add(index++, ed); + } + if (getViewer().getInput() != null) + getViewer().refresh(); + else + getViewer().setInput(gd); + updateColumnSizes((TableViewer) getViewer()); + return true; + } + + private int getStartIndex(GroupData gd, BaseData[] sel) { + for (int i = 0; i < sel.length; i++) { + BaseData ed = sel[i]; + int index = gd.getIndexOf(ed.getId()); + if (index != -1) + return index; + } + return -1; + } + + public boolean validateDrop(Object target, int operation, TransferData transferType) { + return ExtensionDataTransfer.getInstance().isSupportedType(transferType); + } + } + + class TableLabelProvider extends LabelProvider implements ITableLabelProvider { + + public String getText(Object obj) { + if (obj instanceof RootPage) { + return ((RootPage) obj).getNameNoMnemonic(); + } + if (obj instanceof ExtensionData) { + ExtensionData ed = (ExtensionData) obj; + String name = ed.getName(); + if (name != null && name.length() > 0) + return name; + return ed.getId(); + } + if (obj instanceof SeparatorData) { + return Messages.WelcomeCustomizationPreferencePage_horizontalSeparator; + } + if (obj instanceof IntroTheme) { + IntroTheme bg = (IntroTheme) obj; + return bg.getName(); + } + return super.getText(obj); + } + + public Image getImage(Object obj) { + if (obj instanceof ExtensionData) { + ExtensionData ed = (ExtensionData) obj; + switch (ed.getImportance()) { + case ExtensionData.HIGH: + return ihighImage; + case ExtensionData.LOW: + return ilowImage; + case ExtensionData.NEW: + return inewImage; + case ExtensionData.CALLOUT: + return icalloutImage; + } + return extensionImage; + } + if (obj instanceof IntroTheme) + return themeImage; + return null; + } + + public Image getColumnImage(Object element, int columnIndex) { + if (columnIndex == 0) + return getImage(element); + return null; + } + + public String getColumnText(Object element, int columnIndex) { + if (columnIndex == 1 || element instanceof IntroTheme || element instanceof RootPage) + return getText(element); + return null; + } + } + + class IntroTheme { + IConfigurationElement element; + Image previewImage; + + public String getName() { + return element.getAttribute("name"); //$NON-NLS-1$ + } + + public String getId() { + return element.getAttribute("id"); //$NON-NLS-1$ + } + + public IntroTheme(IConfigurationElement element) { + this.element = element; + } + + public Image getPreviewImage() { + if (previewImage==null) { + String path = element.getAttribute("previewImage"); //$NON-NLS-1$ + if (path!=null) { + String bid = element.getDeclaringExtension().getNamespaceIdentifier(); + Bundle bundle = Platform.getBundle(bid); + if (bundle!=null) { + ImageDescriptor desc = ImageUtil.createImageDescriptor(bundle, path); + previewImage = desc.createImage(); + } + } + } + return previewImage; + } + + public void dispose() { + if (previewImage!=null) { + previewImage.dispose(); + previewImage=null; + } + } + } + + protected Control createContents(Composite parent) { + Composite container = new Composite(parent, SWT.NULL); + GridData data = new GridData(); + data.verticalAlignment = GridData.FILL; + data.horizontalAlignment = GridData.FILL; + container.setLayoutData(data); + GridLayout layout = new GridLayout(); + layout.marginHeight = 0; + layout.marginWidth = 0; + container.setLayout(layout); + tabFolder = new TabFolder(container, SWT.TOP); + tabFolder.setLayoutData(new GridData(GridData.FILL_BOTH)); + tabFolder.addSelectionListener(new SelectionAdapter() { + + public void widgetSelected(SelectionEvent e) { + TabItem[] selection = tabFolder.getSelection(); + onTabChange(selection[0]); + } + }); + applyToAll = new Button(container, SWT.CHECK); + applyToAll.setText(Messages.WelcomeCustomizationPreferencePage_applyToAll); + contentProvider = new TableContentProvider(); + labelProvider = new TableLabelProvider(); + if (isCustomizationMode()) { + Button serialize = new Button(container, SWT.PUSH); + serialize.setText(Messages.WelcomeCustomizationPreferencePage_serialize); + serialize.addSelectionListener(new SelectionAdapter() { + + public void widgetSelected(SelectionEvent e) { + doSerializeState(); + } + }); + } + extensionImage = ImageUtil.createImage("full/obj16/extension_obj.gif"); //$NON-NLS-1$ + ihighImage = ImageUtil.createImage("full/obj16/ihigh_obj.gif"); //$NON-NLS-1$ + ilowImage = ImageUtil.createImage("full/obj16/ilow_obj.gif"); //$NON-NLS-1$ + inewImage = ImageUtil.createImage("full/obj16/inew_obj.gif"); //$NON-NLS-1$ + icalloutImage = ImageUtil.createImage("full/obj16/icallout_obj.gif"); //$NON-NLS-1$ + themeImage = ImageUtil.createImage("full/obj16/image_obj.gif"); //$NON-NLS-1$ + addPages(); + org.eclipse.jface.dialogs.Dialog.applyDialogFont(container); + PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, "org.eclipse.ui.intro.universal.universalWelcomePreference"); //$NON-NLS-1$ + return container; + } + + private void doSerializeState() { + FileDialog fd = new FileDialog(shell, SWT.SAVE); + fd.setText(Messages.WelcomeCustomizationPreferencePage_serializeTitle); + String fileName = fd.open(); + if (fileName != null) { + try { + FileWriter writer = new FileWriter(fileName); + PrintWriter pwriter = new PrintWriter(writer); + introData.write(pwriter); + pwriter.close(); + } catch (IOException e) { + // show an error dialog in addition + Log.error("Error while saving the intro data file", e); //$NON-NLS-1$ + } + } + } + + private boolean isCustomizationMode() { + /* + * String[] args = Platform.getApplicationArgs(); for (int i = 0; i < args.length; i++) { if + * (args[i].equalsIgnoreCase("-welcomeCustomization")) //$NON-NLS-1$ return true; } return + * false; + */ + return true; + } + + public void init(IWorkbench workbench) { + } + + private void addPages() { + loadData(false); + addHomePage(); + createPageContainer(); + addRootPages(); + updateWidgetsFromData(); + selectFirstPage(); + } + + private void addRootPages() { + addPage(IUniversalIntroConstants.ID_OVERVIEW); + addPage(IUniversalIntroConstants.ID_FIRSTSTEPS); + addPage(IUniversalIntroConstants.ID_TUTORIALS); + addPage(IUniversalIntroConstants.ID_SAMPLES); + addPage(IUniversalIntroConstants.ID_WHATSNEW); + addPage(IUniversalIntroConstants.ID_WEBRESOURCES); + addPage(IUniversalIntroConstants.ID_MIGRATE); + } + + private void createPageContainer() { + pageContainer = new Composite(tabFolder, SWT.NULL); + GridLayout layout = new GridLayout(); + //layout.horizontalSpacing = 10; + pageContainer.setLayout(layout); + layout.numColumns = 4; + //layout.makeColumnsEqualWidth = true; + Label label; + label = new Label(pageContainer, SWT.WRAP); + label.setText(Messages.WelcomeCustomizationPreferencePage_pageDesc); + GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL); + gd.horizontalSpan = 4; + label.setLayoutData(gd); + label = new Label(pageContainer, SWT.SEPARATOR | SWT.HORIZONTAL); + gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL); + gd.horizontalSpan = 4; + label.setLayoutData(gd); + label = new Label(pageContainer, SWT.NULL); + label.setText(Messages.WelcomeCustomizationPreferencePage_available); + gd = new GridData(); + label.setLayoutData(gd); + label = new Label(pageContainer, SWT.SEPARATOR | SWT.VERTICAL); + gd = new GridData(GridData.VERTICAL_ALIGN_FILL); + gd.verticalSpan = 3; + gd.widthHint = 10; + label.setLayoutData(gd); + + label = new Label(pageContainer, SWT.NULL); + label.setText(Messages.WelcomeCustomizationPreferencePage_left); + label = new Label(pageContainer, SWT.NULL); + label.setText(Messages.WelcomeCustomizationPreferencePage_right); + available = createTableViewer(pageContainer, "hidden"); //$NON-NLS-1$ + available.setComparator(new ViewerComparator()); + gd = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_FILL); + gd.verticalSpan = 2; + gd.widthHint = 100; + //gd.horizontalSpan = 2; + available.getControl().setLayoutData(gd); + + topLeft = createTableViewer(pageContainer, "top-left"); //$NON-NLS-1$ + gd = new GridData(GridData.FILL_BOTH); + gd.widthHint = 100; + topLeft.getControl().setLayoutData(gd); + + topRight = createTableViewer(pageContainer, "top-right"); //$NON-NLS-1$ + gd = new GridData(GridData.FILL_BOTH); + gd.widthHint = 100; + topRight.getControl().setLayoutData(gd); + + //label = new Label(pageContainer, SWT.NULL); + //label.setText(Messages.WelcomeCustomizationPreferencePage_bottom); + bottomLeft = createTableViewer(pageContainer, "bottom-left"); //$NON-NLS-1$ + gd = new GridData(GridData.FILL_BOTH); + gd.widthHint = 100; + bottomLeft.getControl().setLayoutData(gd); + + bottomRight = createTableViewer(pageContainer, "bottom-right"); //$NON-NLS-1$ + gd = new GridData(GridData.FILL_BOTH); + gd.widthHint = 100; + bottomRight.getControl().setLayoutData(gd); + } + + private void updatePageContainer(String pageId, PageData pd) { + if (pageId == null) + return; + refreshQuadrant(topLeft, pd, IUniversalIntroConstants.DIV_LAYOUT_TOP_LEFT); + refreshQuadrant(topRight, pd, IUniversalIntroConstants.DIV_LAYOUT_TOP_RIGHT); + refreshQuadrant(bottomLeft, pd, IUniversalIntroConstants.DIV_LAYOUT_BOTTOM_LEFT); + refreshQuadrant(bottomRight, pd, IUniversalIntroConstants.DIV_LAYOUT_BOTTOM_RIGHT); + refreshQuadrant(available, pd, IUniversalIntroConstants.HIDDEN); + } + + private void refreshQuadrant(TableViewer viewer, PageData pd, String quadrant) { + GroupData gd = pd!=null?pd.findGroup(quadrant):null; + viewer.setInput(gd); + if (gd!=null) + updateColumnSizes(viewer); + } + + private void onTabChange(TabItem item) { + String id = (String) item.getData(); + if (item.getControl() == pageContainer) + updatePageContainer(id, (PageData) item.getData("pageData")); //$NON-NLS-1$ + } + + private void loadData(boolean fromDefault) { + IProduct product = Platform.getProduct(); + if (product == null) + return; + String pid = product.getId(); + introRootPages.clear(); + Preferences prefs = UniversalIntroPlugin.getDefault().getPluginPreferences(); + Preferences iprefs = IntroPlugin.getDefault().getPluginPreferences(); + // 1. Root pages + // try product-qualified value first + String key = pid + "_" + INTRO_ROOT_PAGES; //$NON-NLS-1$ + String rootPages = fromDefault ? prefs.getDefaultString(key) : prefs.getString(key); + if (rootPages.length() == 0) { + rootPages = fromDefault ? prefs.getDefaultString(INTRO_ROOT_PAGES) : prefs + .getString(INTRO_ROOT_PAGES); + } + if (rootPages.length() > 0) { + StringTokenizer stok = new StringTokenizer(rootPages, ","); //$NON-NLS-1$ + while (stok.hasMoreTokens()) { + String tok = stok.nextToken().trim(); + if (!NO_ROOT_PAGES.equals(tok)) { + introRootPages.add(tok); + } + } + } + // 3. Active theme + key = pid + "_" + INTRO_THEME; //$NON-NLS-1$ + String value = fromDefault ? iprefs.getDefaultString(key) : iprefs.getString(key); + if (value.length() == 0) { + key = INTRO_THEME; + value = fromDefault ? iprefs.getDefaultString(key) : iprefs.getString(key); + } + if (value.length() > 0) + introThemeId = value; + // 4. Intro data + key = pid + "_" + INTRO_DATA; //$NON-NLS-1$ + value = fromDefault ? prefs.getDefaultString(key) : prefs.getString(key); + if (value.length() == 0) { + key = INTRO_DATA; + value = fromDefault ? prefs.getDefaultString(key) : prefs.getString(key); + } + if (value.length() == 0) + value = null; + if (value != null && value.startsWith("product:")) //$NON-NLS-1$ + value = value.substring(8); + value = BundleUtil.getResolvedResourceLocation(value, product.getDefiningBundle()); + introData = new IntroData(pid, value, true); + introData.addImplicitContent(); + } + + public void dispose() { + Iterator iter = themeList.iterator(); + while (iter.hasNext()) { + ((IntroTheme)iter.next()).dispose(); + } + extensionImage.dispose(); + ihighImage.dispose(); + ilowImage.dispose(); + inewImage.dispose(); + icalloutImage.dispose(); + themeImage.dispose(); + } + + private void updateIntroThemeFromData() { + if (introThemeId != null) { + for (int i = 0; i < themeList.size(); i++) { + IntroTheme theme = (IntroTheme) themeList.get(i); + if (theme.getId().equals(introThemeId)) { + introTheme = theme; + break; + } + } + } + updateThemePreview(); + } + + private void updateWidgetsFromData() { + // sync up intro background part + updateIntroThemeFromData(); + // sync up the root page checklist + rootPages.setInput(ROOT_PAGE_TABLE); + ArrayList selected = new ArrayList(); + for (int i = 0; i < ROOT_PAGE_TABLE.length; i++) { + String id = ROOT_PAGE_TABLE[i].id; + if (introRootPages.contains(id)) + selected.add(ROOT_PAGE_TABLE[i]); + } + rootPages.setCheckedElements(selected.toArray()); + } + + private void updateThemePreview() { + themes.setInput(themes); + if (introTheme != null) + themes.setSelection(new StructuredSelection(introTheme), true); + themePreview.redraw(); + } + + public boolean performOk() { + saveData(); + BusyIndicator.showWhile(shell.getDisplay(), new Runnable() { + public void run() { + restartIntro(); + } + }); + return true; + } + + /** + * Remember the current page, close intro, reopen it and show the saved page. + * + */ + private void restartIntro() { + IIntroManager manager = PlatformUI.getWorkbench().getIntroManager(); + IIntroPart part = manager.getIntro(); + if (part != null && part instanceof CustomizableIntroPart) { + IntroModelRoot modelRoot = IntroPlugin.getDefault().getIntroModelRoot(); + String currentPageId = modelRoot.getCurrentPageId(); + IWorkbenchWindow window = part.getIntroSite().getWorkbenchWindow(); + boolean standby = manager.isIntroStandby(part); + PlatformUI.getWorkbench().getIntroManager().closeIntro(part); + IntroPlugin.getDefault().resetVolatileImageRegistry(); + UniversalIntroPlugin.getDefault().resetVolatileImageRegistry(); + part = PlatformUI.getWorkbench().getIntroManager().showIntro(window, standby); + if (part != null && !standby) { + StringBuffer url = new StringBuffer(); + url.append("http://org.eclipse.ui.intro/showPage?id="); //$NON-NLS-1$ + url.append(currentPageId); + IIntroURL introURL = IntroURLFactory.createIntroURL(url.toString()); + if (introURL != null) + introURL.execute(); + } + } + } + + protected void performDefaults() { + loadData(true); + // Dispose all the root page tabs + TabItem[] items = tabFolder.getItems(); + for (int i = 0; i < items.length; i++) { + if (items[i].getData("pageData") != null) //$NON-NLS-1$ + items[i].dispose(); + } + // Add them back in based on the checked state + addRootPages(); + updateWidgetsFromData(); + // Get the items again + items = tabFolder.getItems(); + // Select root + onTabChange(items[0]); + } + + private void saveData() { + Preferences prefs = UniversalIntroPlugin.getDefault().getPluginPreferences(); + Preferences iprefs = IntroPlugin.getDefault().getPluginPreferences(); + boolean toAll = applyToAll.getSelection(); + IProduct product = Platform.getProduct(); + if (product == null) + return; + String pid = product.getId(); + StringBuffer sbuf = new StringBuffer(); + if (introRootPages.size() == 0) { + // An empty string means no preference so special value needed + // to indicate no root pages. + sbuf.append(NO_ROOT_PAGES); + } + for (int i = 0; i < introRootPages.size(); i++) { + if (i > 0) + sbuf.append(","); //$NON-NLS-1$ + sbuf.append((String) introRootPages.get(i)); + } + String key = pid + "_" + INTRO_ROOT_PAGES; //$NON-NLS-1$ + prefs.setValue(key, sbuf.toString()); + if (toAll) { + key = INTRO_ROOT_PAGES; + prefs.setValue(key, sbuf.toString()); + } + // store page layouts + StringWriter writer = new StringWriter(); + PrintWriter pwriter = new PrintWriter(writer); + introData.write(pwriter); + pwriter.close(); + String value = writer.toString(); + key = pid + "_" + INTRO_DATA; //$NON-NLS-1$ + prefs.setValue(key, value); + if (toAll) { + key = INTRO_DATA; + prefs.setValue(key, value); + } + if (introTheme != null) { + key = pid + "_" + INTRO_THEME; //$NON-NLS-1$ + value = introTheme.getId(); + iprefs.setValue(key, value); + } + if (toAll) { + key = INTRO_THEME; + iprefs.setValue(key, value); + } + UniversalIntroPlugin.getDefault().savePluginPreferences(); + IntroPlugin.getDefault().savePluginPreferences(); + } + + private void addHomePage() { + TabItem item = new TabItem(tabFolder, SWT.NULL); + item.setText(Messages.WelcomeCustomizationPreferencePage_home); + Composite container = new Composite(tabFolder, SWT.NULL); + GridLayout layout = new GridLayout(); + layout.numColumns = 2; + container.setLayout(layout); + Composite leftColumn = new Composite(container, SWT.NULL); + layout = new GridLayout(); + layout.marginWidth = layout.marginHeight = 0; + leftColumn.setLayout(layout); + leftColumn.setLayoutData(new GridData(GridData.FILL_BOTH)); + Composite rightColumn = new Composite(container, SWT.NULL); + layout = new GridLayout(); + layout.marginWidth = layout.marginHeight = 0; + rightColumn.setLayout(layout); + rightColumn.setLayoutData(new GridData(GridData.FILL_BOTH)); + + Label themeLabel = new Label(leftColumn, SWT.NULL); + themeLabel.setText(Messages.WelcomeCustomizationPreferencePage_background); + GridData gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING); + themeLabel.setLayoutData(gd); + themes = new TableViewer(leftColumn, SWT.BORDER); + themes.getControl().setLayoutData(new GridData(GridData.FILL_BOTH)); + themes.setContentProvider(contentProvider); + themes.setLabelProvider(labelProvider); + themes.addSelectionChangedListener(new ISelectionChangedListener() { + public void selectionChanged(SelectionChangedEvent e) { + Object sel = ((StructuredSelection) e.getSelection()).getFirstElement(); + introTheme = (IntroTheme) sel; + themePreview.redraw(); + } + }); + loadThemes(); + Label previewLabel = new Label(rightColumn, SWT.NULL); + previewLabel.setText(Messages.WelcomeCustomizationPreferencePage_preview); + themePreview = new Canvas(rightColumn, SWT.NULL); + gd = new GridData(); + gd.widthHint = 160+20; + gd.heightHint = 120+20; + themePreview.setLayoutData(gd); + themePreview.addPaintListener(new PaintListener() { + + public void paintControl(PaintEvent e) { + if (introTheme == null) + return; + Image bgImage = introTheme.getPreviewImage(); + if (bgImage == null) + return; + //Rectangle carea = themePreview.getClientArea(); + Rectangle ibounds = bgImage.getBounds(); + e.gc.drawImage(bgImage, 0, 0, ibounds.width, ibounds.height, 10, 10, 160, 120); + } + }); + Label label = new Label(container, SWT.NULL); + label.setText(Messages.WelcomeCustomizationPreferencePage_rootpages); + gd = new GridData(); + gd.horizontalSpan = 2; + label.setLayoutData(gd); + rootPages = CheckboxTableViewer.newCheckList(container, SWT.BORDER); + rootPages.setContentProvider(contentProvider); + rootPages.setLabelProvider(labelProvider); + gd = new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL); + gd.horizontalSpan = 2; + rootPages.getControl().setLayoutData(gd); + rootPages.addCheckStateListener(new ICheckStateListener() { + + public void checkStateChanged(CheckStateChangedEvent event) { + RootPage page = (RootPage) event.getElement(); + boolean checked = event.getChecked(); + onPageChecked(page.id, checked); + } + }); + item.setControl(container); + } + + private void loadThemes() { + IConfigurationElement [] elements = Platform.getExtensionRegistry().getConfigurationElementsFor("org.eclipse.ui.intro.configExtension"); //$NON-NLS-1$ + for (int i=0; i<elements.length; i++) { + if (elements[i].getName().equals("theme")) { //$NON-NLS-1$ + themeList.add(new IntroTheme(elements[i])); + } + } + } + + private void addPage(String id) { + if (!getRootPageSelected(id)) + return; + TabItem item = new TabItem(tabFolder, SWT.NULL); + item.setText(getRootPageName(id)); + item.setControl(pageContainer); + item.setData(id); + PageData pd = introData.getPage(id); + item.setData("pageData", pd); //$NON-NLS-1$ + } + + private void onPageChecked(String id, boolean checked) { + TabItem[] items = tabFolder.getItems(); + if (checked) { + for (int i = 0; i < items.length; i++) { + TabItem item = items[i]; + if (item.getData() != null) + item.dispose(); + } + introRootPages.add(id); + addRootPages(); + } else { + for (int i = 0; i < items.length; i++) { + TabItem item = items[i]; + String itemId = (String) item.getData(); + if (itemId != null && itemId.equals(id)) { + item.dispose(); + introRootPages.remove(id); + return; + } + } + } + } + + private String getRootPageName(String id) { + for (int i = 0; i < ROOT_PAGE_TABLE.length; i++) { + if (ROOT_PAGE_TABLE[i].id.equals(id)) + return ROOT_PAGE_TABLE[i].getName(); + } + return "?"; //$NON-NLS-1$ + } + + private boolean getRootPageSelected(String id) { + for (int i = 0; i < introRootPages.size(); i++) { + String cid = (String) introRootPages.get(i); + if (cid.equals(id)) + return true; + } + return false; + } + + public void setInitializationData(IConfigurationElement config, String propertyName, Object data) + throws CoreException { + } + + private void createPopupMenu(final TableViewer viewer) { + MenuManager manager = new MenuManager(); + manager.createContextMenu(viewer.getControl()); + viewer.getControl().setMenu(manager.getMenu()); + manager.setRemoveAllWhenShown(true); + manager.addMenuListener(new IMenuListener() { + + public void menuAboutToShow(IMenuManager manager) { + fillPopupMenu(manager, viewer); + } + }); + } + + private void addDNDSupport(TableViewer viewer) { + viewer.addDragSupport(DND.DROP_MOVE, TRANSFER_TYPES, new TableDragSourceListener(viewer)); + viewer.addDropSupport(DND.DROP_MOVE, TRANSFER_TYPES, new TableDropTargetListener(viewer)); + } + + private TableViewer createTableViewer(Composite parent, String id) { + final Table table = new Table(parent, SWT.BORDER | SWT.FULL_SELECTION); + final TableColumn column1 = new TableColumn(table, SWT.NULL); + column1.setMoveable(false); + column1.setWidth(20); + column1.setResizable(false); + final TableColumn column2 = new TableColumn(table, SWT.NULL); + column2.setResizable(true); + final TableViewer viewer = new TableViewer(table); + CellEditor[] editors = new CellEditor[2]; + editors[0] = new ComboBoxCellEditor(table, ExtensionData.IMPORTANCE_NAME_TABLE, SWT.READ_ONLY); + viewer.setCellEditors(editors); + viewer.setColumnProperties(new String[] { IUniversalIntroConstants.P_IMPORTANCE, + IUniversalIntroConstants.P_NAME }); + viewer.setCellModifier(new ICellModifier() { + + public boolean canModify(Object element, String property) { + return property.equals(IUniversalIntroConstants.P_IMPORTANCE); + } + + public Object getValue(Object element, String property) { + if (element instanceof ExtensionData) { + ExtensionData ed = (ExtensionData) element; + if (property.equals(IUniversalIntroConstants.P_IMPORTANCE)) + return new Integer(ed.getImportance()); + } + return null; + } + + public void modify(Object element, String property, Object value) { + Integer ivalue = (Integer) value; + TableItem item = (TableItem) element; + ExtensionData ed = (ExtensionData) item.getData(); + ed.setImportance(ivalue.intValue()); + viewer.update(ed, new String [] {IUniversalIntroConstants.P_IMPORTANCE}); + } + }); + viewer.setContentProvider(contentProvider); + viewer.setLabelProvider(labelProvider); + viewer.setData("id", id); //$NON-NLS-1$ + createPopupMenu(viewer); + addDNDSupport(viewer); + return viewer; + } + + private void fillPopupMenu(IMenuManager manager, final TableViewer viewer) { + StructuredSelection ssel = (StructuredSelection) viewer.getSelection(); + + manager.add(new Separator()); + Action addSeparator = new Action(Messages.WelcomeCustomizationPreferencePage_addSeparator) { + public void run() { + doAddSeparator(viewer); + } + }; + + manager.add(addSeparator); + manager.add(new Separator()); + + if (ssel.size() == 1 && viewer != available) { + Action upAction = new Action(Messages.WelcomeCustomizationPreferencePage_up) { + + public void run() { + doMove(viewer, true); + } + }; + Action downAction = new Action(Messages.WelcomeCustomizationPreferencePage_down) { + + public void run() { + doMove(viewer, false); + } + }; + BaseData ed = (BaseData) ssel.getFirstElement(); + GroupData gd = (GroupData) viewer.getInput(); + upAction.setEnabled(gd.canMoveUp(ed)); + downAction.setEnabled(gd.canMoveDown(ed)); + manager.add(upAction); + manager.add(downAction); + } + if (ssel.size() > 0) { + manager.add(new Separator()); + MenuManager menu = new MenuManager(Messages.WelcomeCustomizationPreferencePage_moveTo); + addMoveToAction(menu, available, viewer, + Messages.WelcomeCustomizationPreferencePage_menu_available); + addMoveToAction(menu, topLeft, viewer, Messages.WelcomeCustomizationPreferencePage_menu_top_left); + addMoveToAction(menu, topRight, viewer, Messages.WelcomeCustomizationPreferencePage_menu_top_right); + addMoveToAction(menu, bottomLeft, viewer, Messages.WelcomeCustomizationPreferencePage_menu_bottom_left); + addMoveToAction(menu, bottomRight, viewer, Messages.WelcomeCustomizationPreferencePage_menu_bottom_right); + manager.add(menu); + + boolean addDeleteSeparator=false; + + for (Iterator iter=ssel.iterator(); iter.hasNext();) { + Object obj = iter.next(); + if (obj instanceof SeparatorData) + addDeleteSeparator=true; + else { + addDeleteSeparator=false; + break; + } + } + if (addDeleteSeparator) { + Action deleteSeparator = new Action(Messages.WelcomeCustomizationPreferencePage_removeSeparator) { + public void run() { + doRemoveSeparators(viewer); + } + }; + manager.add(deleteSeparator); + } + } + } + + private void addMoveToAction(MenuManager menu, final TableViewer target, final TableViewer source, + String name) { + if (source == target) + return; + Action action = new Action(name) { + + public void run() { + doMoveTo(source, target); + } + }; + menu.add(action); + } + + private void doMove(Viewer viewer, boolean up) { + Object obj = ((StructuredSelection) viewer.getSelection()).getFirstElement(); + GroupData gd = (GroupData) viewer.getInput(); + if (up) + gd.moveUp((BaseData) obj); + else + gd.moveDown((BaseData) obj); + viewer.refresh(); + } + + private void doAddSeparator(Viewer viewer) { + Object obj = ((StructuredSelection) viewer.getSelection()).getFirstElement(); + GroupData gd = (GroupData) viewer.getInput(); + if (gd == null) { + gd = createTargetGd(viewer); + viewer.setInput(gd); + } + gd.addSeparator((BaseData)obj); + viewer.refresh(); + updateColumnSizes((TableViewer)viewer); + } + + private void doRemoveSeparators(Viewer viewer) { + StructuredSelection ssel = ((StructuredSelection) viewer.getSelection()); + GroupData gd = (GroupData) viewer.getInput(); + for (Iterator iter=ssel.iterator(); iter.hasNext();) { + SeparatorData sdata = (SeparatorData)iter.next(); + gd.remove(sdata); + } + viewer.refresh(); + } + + private void doMoveTo(TableViewer source, TableViewer target) { + Object[] selObjs = ((StructuredSelection) source.getSelection()).toArray(); + GroupData sourceGd = (GroupData) source.getInput(); + GroupData targetGd = (GroupData) target.getInput(); + if (targetGd == null) { + targetGd = createTargetGd(target); + } + for (int i = 0; i < selObjs.length; i++) { + BaseData ed = (BaseData) selObjs[i]; + sourceGd.remove(ed); + targetGd.add(ed); + } + source.refresh(); + updateColumnSizes(source); + if (target.getInput() != null) + target.refresh(); + else + target.setInput(targetGd); + updateColumnSizes(target); + } + + private void updateColumnSizes(TableViewer viewer) { + TableColumn sc = viewer.getTable().getColumn(1); + sc.pack(); + } + + private GroupData createTargetGd(Viewer target) { + GroupData targetGd = null; + if (target == topLeft) + targetGd = new GroupData(PageData.P_TOP_LEFT, false); + else if (target == topRight) + targetGd = new GroupData(PageData.P_TOP_RIGHT, false); + else if (target == bottomLeft) + targetGd = new GroupData(PageData.P_BOTTOM_LEFT, false); + else if (target == bottomRight) + targetGd = new GroupData(PageData.P_BOTTOM_RIGHT, false); + else if (target == available) + targetGd = new GroupData(IUniversalIntroConstants.HIDDEN, false); + else + return null; + TabItem[] items = tabFolder.getSelection(); + PageData pd = (PageData) items[0].getData("pageData"); //$NON-NLS-1$ + if (pd == null) { + String pageId = (String)items[0].getData(); + pd = new PageData(pageId); + items[0].setData("pageData", pd); //$NON-NLS-1$ + introRootPages.add(pageId); + } + pd.add(targetGd); + return targetGd; + } + + private void selectFirstPage() { + if (firstPageId == null) + return; + TabItem[] items = tabFolder.getItems(); + for (int i = 0; i < items.length; i++) { + TabItem item = items[i]; + PageData pd = (PageData) item.getData("pageData"); //$NON-NLS-1$ + if (pd != null && pd.getId().equals(firstPageId)) { + tabFolder.setSelection(i); + onTabChange(item); + return; + } + } + } + + public void setCurrentPage(String pageId) { + firstPageId = pageId; + } + + public void setShell(Shell shell) { + this.shell = shell; + } +} diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/CustomizationDialog.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/CustomizationDialog.java new file mode 100644 index 000000000..cf865ad7c --- /dev/null +++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/CustomizationDialog.java @@ -0,0 +1,67 @@ +/******************************************************************************* + * Copyright (c) 2008 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ + +package org.eclipse.ui.internal.intro.universal; + +import org.eclipse.jface.dialogs.TrayDialog; +import org.eclipse.swt.SWT; +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.internal.intro.universal.util.ImageUtil; + +public class CustomizationDialog extends TrayDialog { + + private CustomizationContentsArea contentsArea; + private String pageId; + + private CustomizationContentsArea getContentsArea() { + if (contentsArea == null) { + contentsArea = new CustomizationContentsArea(); + } + return contentsArea; + } + protected CustomizationDialog(Shell shell, String pageId) { + super(shell); + setShellStyle(getShellStyle() | SWT.RESIZE); + this.pageId = pageId; + } + + protected Control createDialogArea(Composite parent) { + CustomizationContentsArea contents = getContentsArea(); + contents.setShell(getShell()); + contents.setCurrentPage(pageId); + Composite outerContainer = (Composite) super.createDialogArea(parent); + Control inner = contents.createContents(outerContainer); + inner.setLayoutData(new GridData(GridData.FILL_BOTH)); + return outerContainer; + } + + protected void okPressed() { + if (getContentsArea().performOk()) { + getContentsArea().dispose(); + } + super.okPressed(); + } + + protected void cancelPressed() { + getContentsArea().dispose(); + super.cancelPressed(); + } + + protected void configureShell(Shell newShell) { + super.configureShell(newShell); + newShell.setText(Messages.WelcomeCustomizationPreferencePage_Customize); + newShell.setImage(ImageUtil.createImage("full/elcl16/configure.gif")); //$NON-NLS-1$); + } + +} diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/CustomizeAction.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/CustomizeAction.java index f24069c07..f48430ee7 100644 --- a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/CustomizeAction.java +++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/CustomizeAction.java @@ -14,7 +14,6 @@ import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.action.Action; import org.eclipse.jface.preference.IPreferenceNode; -import org.eclipse.jface.preference.PreferenceDialog; import org.eclipse.jface.preference.PreferenceManager; import org.eclipse.jface.preference.PreferenceNode; import org.eclipse.ui.IWorkbenchWindow; @@ -59,8 +58,8 @@ public class CustomizeAction extends Action { IPreferenceNode node = createPreferenceNode(pageId); pm.addToRoot(node); IWorkbenchWindow window = site.getWorkbenchWindow(); - PreferenceDialog dialog = new PreferenceDialog(window.getShell(), pm); - dialog.open(); + CustomizationDialog dlg = new CustomizationDialog(window.getShell(), pageId); + dlg.open(); } private IPreferenceNode createPreferenceNode(final String pageId) { diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/Messages.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/Messages.java index 85e39094b..371b36050 100644 --- a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/Messages.java +++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/Messages.java @@ -97,4 +97,5 @@ public class Messages extends NLS { public static String WelcomeCustomizationPreferencePage_horizontalSeparator; public static String WelcomeCustomizationPreferencePage_addSeparator; public static String WelcomeCustomizationPreferencePage_removeSeparator; + public static String WelcomeCustomizationPreferencePage_Customize; } diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/Messages.properties b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/Messages.properties index 9aa60245c..ab661db58 100644 --- a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/Messages.properties +++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/Messages.properties @@ -87,6 +87,7 @@ WelcomeCustomizationPreferencePage_NoMnemonic_samples= Samples WelcomeCustomizationPreferencePage_NoMnemonic_whatsnew= What's New WelcomeCustomizationPreferencePage_NoMnemonic_webresources= Web Resources WelcomeCustomizationPreferencePage_NoMnemonic_migrate= Migrate +WelcomeCustomizationPreferencePage_Customize= Customize #Importance levels ExtensionData_callout=Callout diff --git a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/WelcomeCustomizationPreferencePage.java b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/WelcomeCustomizationPreferencePage.java index 5469cce11..b5e45a8ba 100644 --- a/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/WelcomeCustomizationPreferencePage.java +++ b/org.eclipse.ui.intro.universal/src/org/eclipse/ui/internal/intro/universal/WelcomeCustomizationPreferencePage.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006, 2007 IBM Corporation and others. + * Copyright (c) 2006, 2008 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -10,394 +10,20 @@ *******************************************************************************/ package org.eclipse.ui.internal.intro.universal; -import java.io.FileWriter; -import java.io.IOException; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.StringTokenizer; - import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExecutableExtension; -import org.eclipse.core.runtime.IProduct; -import org.eclipse.core.runtime.Platform; -import org.eclipse.core.runtime.Preferences; -import org.eclipse.jface.action.Action; -import org.eclipse.jface.action.IMenuListener; -import org.eclipse.jface.action.IMenuManager; -import org.eclipse.jface.action.MenuManager; -import org.eclipse.jface.action.Separator; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.viewers.CellEditor; -import org.eclipse.jface.viewers.CheckStateChangedEvent; -import org.eclipse.jface.viewers.CheckboxTableViewer; -import org.eclipse.jface.viewers.ComboBoxCellEditor; -import org.eclipse.jface.viewers.ICellModifier; -import org.eclipse.jface.viewers.ICheckStateListener; -import org.eclipse.jface.viewers.ISelectionChangedListener; -import org.eclipse.jface.viewers.IStructuredContentProvider; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.ITableLabelProvider; -import org.eclipse.jface.viewers.LabelProvider; -import org.eclipse.jface.viewers.SelectionChangedEvent; -import org.eclipse.jface.viewers.StructuredSelection; -import org.eclipse.jface.viewers.TableViewer; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.jface.viewers.ViewerComparator; -import org.eclipse.jface.viewers.ViewerDropAdapter; -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.BusyIndicator; -import org.eclipse.swt.dnd.DND; -import org.eclipse.swt.dnd.DragSourceEvent; -import org.eclipse.swt.dnd.DragSourceListener; -import org.eclipse.swt.dnd.Transfer; -import org.eclipse.swt.dnd.TransferData; -import org.eclipse.swt.events.PaintEvent; -import org.eclipse.swt.events.PaintListener; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Canvas; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.FileDialog; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.TabFolder; -import org.eclipse.swt.widgets.TabItem; -import org.eclipse.swt.widgets.Table; -import org.eclipse.swt.widgets.TableColumn; -import org.eclipse.swt.widgets.TableItem; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; -import org.eclipse.ui.IWorkbenchWindow; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.internal.intro.impl.IntroPlugin; -import org.eclipse.ui.internal.intro.impl.model.IntroModelRoot; -import org.eclipse.ui.internal.intro.universal.util.BundleUtil; -import org.eclipse.ui.internal.intro.universal.util.ImageUtil; -import org.eclipse.ui.internal.intro.universal.util.Log; -import org.eclipse.ui.intro.IIntroManager; -import org.eclipse.ui.intro.IIntroPart; -import org.eclipse.ui.intro.config.CustomizableIntroPart; -import org.eclipse.ui.intro.config.IIntroURL; -import org.eclipse.ui.intro.config.IntroURLFactory; -import org.osgi.framework.Bundle; - public class WelcomeCustomizationPreferencePage extends PreferencePage implements IWorkbenchPreferencePage, IExecutableExtension { - private static final String INTRO_ROOT_PAGES = "INTRO_ROOT_PAGES"; //$NON-NLS-1$ - private static final String INTRO_DATA = "INTRO_DATA"; //$NON-NLS-1$ - private static final String INTRO_THEME = "INTRO_THEME"; //$NON-NLS-1$ - private static final String NO_ROOT_PAGES = "no_root_pages"; //$NON-NLS-1$ - private TabFolder tabFolder; - private String firstPageId; - private Composite pageContainer; - private TableViewer themes; - private TableViewer available; - private TableViewer topLeft; - private TableViewer topRight; - private TableViewer bottomLeft; - private TableViewer bottomRight; - private CheckboxTableViewer rootPages; - private ArrayList introRootPages = new ArrayList(); - private ArrayList themeList = new ArrayList(); - private IntroTheme introTheme; - private String introThemeId; - private IntroData introData; - private Canvas themePreview; - private TableContentProvider contentProvider; - private TableLabelProvider labelProvider; - private Button applyToAll; - private Image extensionImage; - private Image themeImage; - private Image ihighImage; - private Image ilowImage; - private Image inewImage; - private Image icalloutImage; - private static final Transfer[] TRANSFER_TYPES = new Transfer[] { ExtensionDataTransfer.getInstance() }; - - - private static final RootPage ROOT_PAGE_TABLE[] = new RootPage[] { - new RootPage(IUniversalIntroConstants.ID_OVERVIEW, - Messages.WelcomeCustomizationPreferencePage_overview, - Messages.WelcomeCustomizationPreferencePage_NoMnemonic_overview), - new RootPage(IUniversalIntroConstants.ID_FIRSTSTEPS, - Messages.WelcomeCustomizationPreferencePage_firststeps, - Messages.WelcomeCustomizationPreferencePage_NoMnemonic_firststeps), - new RootPage(IUniversalIntroConstants.ID_TUTORIALS, - Messages.WelcomeCustomizationPreferencePage_tutorials, - Messages.WelcomeCustomizationPreferencePage_NoMnemonic_tutorials), - new RootPage(IUniversalIntroConstants.ID_SAMPLES, - Messages.WelcomeCustomizationPreferencePage_samples, - Messages.WelcomeCustomizationPreferencePage_NoMnemonic_samples), - new RootPage(IUniversalIntroConstants.ID_WHATSNEW, - Messages.WelcomeCustomizationPreferencePage_whatsnew, - Messages.WelcomeCustomizationPreferencePage_NoMnemonic_whatsnew), - new RootPage(IUniversalIntroConstants.ID_WEBRESOURCES, - Messages.WelcomeCustomizationPreferencePage_webresources, - Messages.WelcomeCustomizationPreferencePage_NoMnemonic_webresources), - new RootPage(IUniversalIntroConstants.ID_MIGRATE, - Messages.WelcomeCustomizationPreferencePage_migrate, - Messages.WelcomeCustomizationPreferencePage_NoMnemonic_migrate) }; - - static class RootPage { - - public String id; - public String name; - public String nameNoMnemonic; - - public RootPage(String id, String name, String nameNoMnemonic) { - this.id = id; - this.name = name; - this.nameNoMnemonic = nameNoMnemonic; - } - - public String getName() { - return name; - } - - public String getNameNoMnemonic() { - return nameNoMnemonic; - } - - public boolean equals(Object obj) { - if (obj == this) - return true; - if (obj == null) - return false; - if (obj instanceof RootPage) { - RootPage page = (RootPage) obj; - return page.id.equals(id) && page.name.equals(name); - } - return false; - } - - public String toString() { - return name; - } - } - - class TableContentProvider implements IStructuredContentProvider { - - public Object[] getElements(Object inputElement) { - if (inputElement == ROOT_PAGE_TABLE) - return ROOT_PAGE_TABLE; - if (inputElement instanceof GroupData) { - return ((GroupData) inputElement).getChildren(); - } - if (inputElement == themes) { - return themeList.toArray(); - } - return new Object[0]; - } - - public void dispose() { - } - - public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { - } - } - - class TableDragSourceListener implements DragSourceListener { - - TableViewer viewer; - BaseData[] sel; - - public TableDragSourceListener(TableViewer viewer) { - this.viewer = viewer; - } - - public void dragStart(DragSourceEvent event) { - IStructuredSelection ssel = (IStructuredSelection) viewer.getSelection(); - if (ssel.size() > 0) { - event.doit = true; - } else { - event.doit = false; - } - }; - - public void dragSetData(DragSourceEvent event) { - IStructuredSelection ssel = (IStructuredSelection) viewer.getSelection(); - BaseData[] array = new BaseData[ssel.size()]; - int i = 0; - for (Iterator iter = ssel.iterator(); iter.hasNext();) { - array[i++] = (BaseData) iter.next(); - } - event.data = array; - sel = array; - } - - public void dragFinished(DragSourceEvent event) { - if (event.detail == DND.DROP_MOVE) { - GroupData gd = (GroupData) viewer.getInput(); - for (int i = 0; i < sel.length; i++) { - BaseData ed = sel[i]; - gd.remove(ed); - } - viewer.refresh(); - updateColumnSizes(viewer); - } - sel = null; - } - } - - class TableDropTargetListener extends ViewerDropAdapter { - - public TableDropTargetListener(TableViewer viewer) { - super(viewer); - } - - public boolean performDrop(Object data) { - BaseData target = (BaseData) getCurrentTarget(); - int loc = getCurrentLocation(); - GroupData gd = (GroupData) getViewer().getInput(); - if (gd == null) - gd = createTargetGd(getViewer()); - BaseData[] sel = (BaseData[]) data; - - int index = target != null ? gd.getIndexOf(target) : -1; - int startingIndex = getStartIndex(gd, sel); - if (target != null) { - if (loc == LOCATION_AFTER - || (loc == LOCATION_ON && startingIndex != -1 && startingIndex < index)) - index++; - else if (index > 0 && loc == LOCATION_BEFORE) - index--; - } - - for (int i = 0; i < sel.length; i++) { - BaseData ed = sel[i]; - if (index == -1) - gd.add(ed); - else - gd.add(index++, ed); - } - if (getViewer().getInput() != null) - getViewer().refresh(); - else - getViewer().setInput(gd); - updateColumnSizes((TableViewer) getViewer()); - return true; - } - - private int getStartIndex(GroupData gd, BaseData[] sel) { - for (int i = 0; i < sel.length; i++) { - BaseData ed = sel[i]; - int index = gd.getIndexOf(ed.getId()); - if (index != -1) - return index; - } - return -1; - } - - public boolean validateDrop(Object target, int operation, TransferData transferType) { - return ExtensionDataTransfer.getInstance().isSupportedType(transferType); - } - } - - class TableLabelProvider extends LabelProvider implements ITableLabelProvider { - - public String getText(Object obj) { - if (obj instanceof RootPage) { - return ((RootPage) obj).getNameNoMnemonic(); - } - if (obj instanceof ExtensionData) { - ExtensionData ed = (ExtensionData) obj; - String name = ed.getName(); - if (name != null && name.length() > 0) - return name; - return ed.getId(); - } - if (obj instanceof SeparatorData) { - return Messages.WelcomeCustomizationPreferencePage_horizontalSeparator; - } - if (obj instanceof IntroTheme) { - IntroTheme bg = (IntroTheme) obj; - return bg.getName(); - } - return super.getText(obj); - } - - public Image getImage(Object obj) { - if (obj instanceof ExtensionData) { - ExtensionData ed = (ExtensionData) obj; - switch (ed.getImportance()) { - case ExtensionData.HIGH: - return ihighImage; - case ExtensionData.LOW: - return ilowImage; - case ExtensionData.NEW: - return inewImage; - case ExtensionData.CALLOUT: - return icalloutImage; - } - return extensionImage; - } - if (obj instanceof IntroTheme) - return themeImage; - return null; - } - - public Image getColumnImage(Object element, int columnIndex) { - if (columnIndex == 0) - return getImage(element); - return null; - } - - public String getColumnText(Object element, int columnIndex) { - if (columnIndex == 1 || element instanceof IntroTheme || element instanceof RootPage) - return getText(element); - return null; - } - } - - class IntroTheme { - IConfigurationElement element; - Image previewImage; - - public String getName() { - return element.getAttribute("name"); //$NON-NLS-1$ - } - - public String getId() { - return element.getAttribute("id"); //$NON-NLS-1$ - } - - public IntroTheme(IConfigurationElement element) { - this.element = element; - } - - public Image getPreviewImage() { - if (previewImage==null) { - String path = element.getAttribute("previewImage"); //$NON-NLS-1$ - if (path!=null) { - String bid = element.getDeclaringExtension().getNamespaceIdentifier(); - Bundle bundle = Platform.getBundle(bid); - if (bundle!=null) { - ImageDescriptor desc = ImageUtil.createImageDescriptor(bundle, path); - previewImage = desc.createImage(); - } - } - } - return previewImage; - } - - public void dispose() { - if (previewImage!=null) { - previewImage.dispose(); - previewImage=null; - } - } - } + private CustomizationContentsArea contentsArea; public WelcomeCustomizationPreferencePage() { } @@ -409,771 +35,41 @@ public class WelcomeCustomizationPreferencePage extends PreferencePage implement public WelcomeCustomizationPreferencePage(String title, ImageDescriptor image) { super(title, image); } - - protected Control createContents(Composite parent) { - Composite container = new Composite(parent, SWT.NULL); - GridData data = new GridData(); - data.verticalAlignment = GridData.FILL; - data.horizontalAlignment = GridData.FILL; - container.setLayoutData(data); - GridLayout layout = new GridLayout(); - layout.marginHeight = 0; - layout.marginWidth = 0; - container.setLayout(layout); - tabFolder = new TabFolder(container, SWT.TOP); - tabFolder.setLayoutData(new GridData(GridData.FILL_BOTH)); - tabFolder.addSelectionListener(new SelectionAdapter() { - - public void widgetSelected(SelectionEvent e) { - TabItem[] selection = tabFolder.getSelection(); - onTabChange(selection[0]); - } - }); - applyToAll = new Button(container, SWT.CHECK); - applyToAll.setText(Messages.WelcomeCustomizationPreferencePage_applyToAll); - contentProvider = new TableContentProvider(); - labelProvider = new TableLabelProvider(); - if (isCustomizationMode()) { - Button serialize = new Button(container, SWT.PUSH); - serialize.setText(Messages.WelcomeCustomizationPreferencePage_serialize); - serialize.addSelectionListener(new SelectionAdapter() { - - public void widgetSelected(SelectionEvent e) { - doSerializeState(); - } - }); - } - extensionImage = ImageUtil.createImage("full/obj16/extension_obj.gif"); //$NON-NLS-1$ - ihighImage = ImageUtil.createImage("full/obj16/ihigh_obj.gif"); //$NON-NLS-1$ - ilowImage = ImageUtil.createImage("full/obj16/ilow_obj.gif"); //$NON-NLS-1$ - inewImage = ImageUtil.createImage("full/obj16/inew_obj.gif"); //$NON-NLS-1$ - icalloutImage = ImageUtil.createImage("full/obj16/icallout_obj.gif"); //$NON-NLS-1$ - themeImage = ImageUtil.createImage("full/obj16/image_obj.gif"); //$NON-NLS-1$ - addPages(); - org.eclipse.jface.dialogs.Dialog.applyDialogFont(container); - PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, "org.eclipse.ui.intro.universal.universalWelcomePreference"); //$NON-NLS-1$ - return container; - } - - private void doSerializeState() { - FileDialog fd = new FileDialog(getShell(), SWT.SAVE); - fd.setText(Messages.WelcomeCustomizationPreferencePage_serializeTitle); - String fileName = fd.open(); - if (fileName != null) { - try { - FileWriter writer = new FileWriter(fileName); - PrintWriter pwriter = new PrintWriter(writer); - introData.write(pwriter); - pwriter.close(); - } catch (IOException e) { - // show an error dialog in addition - Log.error("Error while saving the intro data file", e); //$NON-NLS-1$ - } + + private CustomizationContentsArea getContentsArea() { + if (contentsArea == null) { + contentsArea = new CustomizationContentsArea(); } + return contentsArea; } - private boolean isCustomizationMode() { - /* - * String[] args = Platform.getApplicationArgs(); for (int i = 0; i < args.length; i++) { if - * (args[i].equalsIgnoreCase("-welcomeCustomization")) //$NON-NLS-1$ return true; } return - * false; - */ - return true; - } - - public void init(IWorkbench workbench) { - } - - private void addPages() { - loadData(false); - addHomePage(); - createPageContainer(); - addRootPages(); - updateWidgetsFromData(); - selectFirstPage(); - } - - private void addRootPages() { - addPage(IUniversalIntroConstants.ID_OVERVIEW); - addPage(IUniversalIntroConstants.ID_FIRSTSTEPS); - addPage(IUniversalIntroConstants.ID_TUTORIALS); - addPage(IUniversalIntroConstants.ID_SAMPLES); - addPage(IUniversalIntroConstants.ID_WHATSNEW); - addPage(IUniversalIntroConstants.ID_WEBRESOURCES); - addPage(IUniversalIntroConstants.ID_MIGRATE); - } - - private void createPageContainer() { - pageContainer = new Composite(tabFolder, SWT.NULL); - GridLayout layout = new GridLayout(); - //layout.horizontalSpacing = 10; - pageContainer.setLayout(layout); - layout.numColumns = 4; - //layout.makeColumnsEqualWidth = true; - Label label; - label = new Label(pageContainer, SWT.WRAP); - label.setText(Messages.WelcomeCustomizationPreferencePage_pageDesc); - GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL); - gd.horizontalSpan = 4; - label.setLayoutData(gd); - label = new Label(pageContainer, SWT.SEPARATOR | SWT.HORIZONTAL); - gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL); - gd.horizontalSpan = 4; - label.setLayoutData(gd); - label = new Label(pageContainer, SWT.NULL); - label.setText(Messages.WelcomeCustomizationPreferencePage_available); - gd = new GridData(); - label.setLayoutData(gd); - label = new Label(pageContainer, SWT.SEPARATOR | SWT.VERTICAL); - gd = new GridData(GridData.VERTICAL_ALIGN_FILL); - gd.verticalSpan = 3; - gd.widthHint = 10; - label.setLayoutData(gd); - - label = new Label(pageContainer, SWT.NULL); - label.setText(Messages.WelcomeCustomizationPreferencePage_left); - label = new Label(pageContainer, SWT.NULL); - label.setText(Messages.WelcomeCustomizationPreferencePage_right); - available = createTableViewer(pageContainer, "hidden"); //$NON-NLS-1$ - available.setComparator(new ViewerComparator()); - gd = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_FILL); - gd.verticalSpan = 2; - gd.widthHint = 100; - //gd.horizontalSpan = 2; - available.getControl().setLayoutData(gd); - - topLeft = createTableViewer(pageContainer, "top-left"); //$NON-NLS-1$ - gd = new GridData(GridData.FILL_BOTH); - gd.widthHint = 100; - topLeft.getControl().setLayoutData(gd); - - topRight = createTableViewer(pageContainer, "top-right"); //$NON-NLS-1$ - gd = new GridData(GridData.FILL_BOTH); - gd.widthHint = 100; - topRight.getControl().setLayoutData(gd); - - //label = new Label(pageContainer, SWT.NULL); - //label.setText(Messages.WelcomeCustomizationPreferencePage_bottom); - bottomLeft = createTableViewer(pageContainer, "bottom-left"); //$NON-NLS-1$ - gd = new GridData(GridData.FILL_BOTH); - gd.widthHint = 100; - bottomLeft.getControl().setLayoutData(gd); - - bottomRight = createTableViewer(pageContainer, "bottom-right"); //$NON-NLS-1$ - gd = new GridData(GridData.FILL_BOTH); - gd.widthHint = 100; - bottomRight.getControl().setLayoutData(gd); - } - - private void updatePageContainer(String pageId, PageData pd) { - if (pageId == null) - return; - refreshQuadrant(topLeft, pd, IUniversalIntroConstants.DIV_LAYOUT_TOP_LEFT); - refreshQuadrant(topRight, pd, IUniversalIntroConstants.DIV_LAYOUT_TOP_RIGHT); - refreshQuadrant(bottomLeft, pd, IUniversalIntroConstants.DIV_LAYOUT_BOTTOM_LEFT); - refreshQuadrant(bottomRight, pd, IUniversalIntroConstants.DIV_LAYOUT_BOTTOM_RIGHT); - refreshQuadrant(available, pd, IUniversalIntroConstants.HIDDEN); - } - - private void refreshQuadrant(TableViewer viewer, PageData pd, String quadrant) { - GroupData gd = pd!=null?pd.findGroup(quadrant):null; - viewer.setInput(gd); - if (gd!=null) - updateColumnSizes(viewer); - } - - private void onTabChange(TabItem item) { - String id = (String) item.getData(); - if (item.getControl() == pageContainer) - updatePageContainer(id, (PageData) item.getData("pageData")); //$NON-NLS-1$ - } - - private void loadData(boolean fromDefault) { - IProduct product = Platform.getProduct(); - if (product == null) - return; - String pid = product.getId(); - introRootPages.clear(); - Preferences prefs = UniversalIntroPlugin.getDefault().getPluginPreferences(); - Preferences iprefs = IntroPlugin.getDefault().getPluginPreferences(); - // 1. Root pages - // try product-qualified value first - String key = pid + "_" + INTRO_ROOT_PAGES; //$NON-NLS-1$ - String rootPages = fromDefault ? prefs.getDefaultString(key) : prefs.getString(key); - if (rootPages.length() == 0) { - rootPages = fromDefault ? prefs.getDefaultString(INTRO_ROOT_PAGES) : prefs - .getString(INTRO_ROOT_PAGES); - } - if (rootPages.length() > 0) { - StringTokenizer stok = new StringTokenizer(rootPages, ","); //$NON-NLS-1$ - while (stok.hasMoreTokens()) { - String tok = stok.nextToken().trim(); - if (!NO_ROOT_PAGES.equals(tok)) { - introRootPages.add(tok); - } - } - } - // 3. Active theme - key = pid + "_" + INTRO_THEME; //$NON-NLS-1$ - String value = fromDefault ? iprefs.getDefaultString(key) : iprefs.getString(key); - if (value.length() == 0) { - key = INTRO_THEME; - value = fromDefault ? iprefs.getDefaultString(key) : iprefs.getString(key); - } - if (value.length() > 0) - introThemeId = value; - // 4. Intro data - key = pid + "_" + INTRO_DATA; //$NON-NLS-1$ - value = fromDefault ? prefs.getDefaultString(key) : prefs.getString(key); - if (value.length() == 0) { - key = INTRO_DATA; - value = fromDefault ? prefs.getDefaultString(key) : prefs.getString(key); - } - if (value.length() == 0) - value = null; - if (value != null && value.startsWith("product:")) //$NON-NLS-1$ - value = value.substring(8); - value = BundleUtil.getResolvedResourceLocation(value, product.getDefiningBundle()); - introData = new IntroData(pid, value, true); - introData.addImplicitContent(); + protected Control createContents(Composite parent) { + getContentsArea().setShell(getShell()); + return getContentsArea().createContents(parent); } public void dispose() { - Iterator iter = themeList.iterator(); - while (iter.hasNext()) { - ((IntroTheme)iter.next()).dispose(); - } - extensionImage.dispose(); - ihighImage.dispose(); - ilowImage.dispose(); - inewImage.dispose(); - icalloutImage.dispose(); - themeImage.dispose(); + getContentsArea().dispose(); super.dispose(); } - private void updateIntroThemeFromData() { - if (introThemeId != null) { - for (int i = 0; i < themeList.size(); i++) { - IntroTheme theme = (IntroTheme) themeList.get(i); - if (theme.getId().equals(introThemeId)) { - introTheme = theme; - break; - } - } - } - updateThemePreview(); - } - - private void updateWidgetsFromData() { - // sync up intro background part - updateIntroThemeFromData(); - // sync up the root page checklist - rootPages.setInput(ROOT_PAGE_TABLE); - ArrayList selected = new ArrayList(); - for (int i = 0; i < ROOT_PAGE_TABLE.length; i++) { - String id = ROOT_PAGE_TABLE[i].id; - if (introRootPages.contains(id)) - selected.add(ROOT_PAGE_TABLE[i]); - } - rootPages.setCheckedElements(selected.toArray()); - } - - private void updateThemePreview() { - themes.setInput(themes); - if (introTheme != null) - themes.setSelection(new StructuredSelection(introTheme), true); - themePreview.redraw(); - } - public boolean performOk() { - saveData(); - BusyIndicator.showWhile(getShell().getDisplay(), new Runnable() { - - public void run() { - restartIntro(); - } - }); - return true; - } - - /** - * Remember the current page, close intro, reopen it and show the saved page. - * - */ - private void restartIntro() { - IIntroManager manager = PlatformUI.getWorkbench().getIntroManager(); - IIntroPart part = manager.getIntro(); - if (part != null && part instanceof CustomizableIntroPart) { - IntroModelRoot modelRoot = IntroPlugin.getDefault().getIntroModelRoot(); - String currentPageId = modelRoot.getCurrentPageId(); - IWorkbenchWindow window = part.getIntroSite().getWorkbenchWindow(); - boolean standby = manager.isIntroStandby(part); - PlatformUI.getWorkbench().getIntroManager().closeIntro(part); - IntroPlugin.getDefault().resetVolatileImageRegistry(); - UniversalIntroPlugin.getDefault().resetVolatileImageRegistry(); - part = PlatformUI.getWorkbench().getIntroManager().showIntro(window, standby); - if (part != null && !standby) { - StringBuffer url = new StringBuffer(); - url.append("http://org.eclipse.ui.intro/showPage?id="); //$NON-NLS-1$ - url.append(currentPageId); - IIntroURL introURL = IntroURLFactory.createIntroURL(url.toString()); - if (introURL != null) - introURL.execute(); - } - } + return getContentsArea().performOk(); } protected void performDefaults() { - loadData(true); - // Dispose all the root page tabs - TabItem[] items = tabFolder.getItems(); - for (int i = 0; i < items.length; i++) { - if (items[i].getData("pageData") != null) //$NON-NLS-1$ - items[i].dispose(); - } - // Add them back in based on the checked state - addRootPages(); - updateWidgetsFromData(); - // Get the items again - items = tabFolder.getItems(); - // Select root - onTabChange(items[0]); - super.performDefaults(); - } - - private void saveData() { - Preferences prefs = UniversalIntroPlugin.getDefault().getPluginPreferences(); - Preferences iprefs = IntroPlugin.getDefault().getPluginPreferences(); - boolean toAll = applyToAll.getSelection(); - IProduct product = Platform.getProduct(); - if (product == null) - return; - String pid = product.getId(); - StringBuffer sbuf = new StringBuffer(); - if (introRootPages.size() == 0) { - // An empty string means no preference so special value needed - // to indicate no root pages. - sbuf.append(NO_ROOT_PAGES); - } - for (int i = 0; i < introRootPages.size(); i++) { - if (i > 0) - sbuf.append(","); //$NON-NLS-1$ - sbuf.append((String) introRootPages.get(i)); - } - String key = pid + "_" + INTRO_ROOT_PAGES; //$NON-NLS-1$ - prefs.setValue(key, sbuf.toString()); - if (toAll) { - key = INTRO_ROOT_PAGES; - prefs.setValue(key, sbuf.toString()); - } - // store page layouts - StringWriter writer = new StringWriter(); - PrintWriter pwriter = new PrintWriter(writer); - introData.write(pwriter); - pwriter.close(); - String value = writer.toString(); - key = pid + "_" + INTRO_DATA; //$NON-NLS-1$ - prefs.setValue(key, value); - if (toAll) { - key = INTRO_DATA; - prefs.setValue(key, value); - } - if (introTheme != null) { - key = pid + "_" + INTRO_THEME; //$NON-NLS-1$ - value = introTheme.getId(); - iprefs.setValue(key, value); - } - if (toAll) { - key = INTRO_THEME; - iprefs.setValue(key, value); - } - UniversalIntroPlugin.getDefault().savePluginPreferences(); - IntroPlugin.getDefault().savePluginPreferences(); - } - - private void addHomePage() { - TabItem item = new TabItem(tabFolder, SWT.NULL); - item.setText(Messages.WelcomeCustomizationPreferencePage_home); - Composite container = new Composite(tabFolder, SWT.NULL); - GridLayout layout = new GridLayout(); - layout.numColumns = 2; - container.setLayout(layout); - Composite leftColumn = new Composite(container, SWT.NULL); - layout = new GridLayout(); - layout.marginWidth = layout.marginHeight = 0; - leftColumn.setLayout(layout); - leftColumn.setLayoutData(new GridData(GridData.FILL_BOTH)); - Composite rightColumn = new Composite(container, SWT.NULL); - layout = new GridLayout(); - layout.marginWidth = layout.marginHeight = 0; - rightColumn.setLayout(layout); - rightColumn.setLayoutData(new GridData(GridData.FILL_BOTH)); - - Label themeLabel = new Label(leftColumn, SWT.NULL); - themeLabel.setText(Messages.WelcomeCustomizationPreferencePage_background); - GridData gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING); - themeLabel.setLayoutData(gd); - themes = new TableViewer(leftColumn, SWT.BORDER); - themes.getControl().setLayoutData(new GridData(GridData.FILL_BOTH)); - themes.setContentProvider(contentProvider); - themes.setLabelProvider(labelProvider); - themes.addSelectionChangedListener(new ISelectionChangedListener() { - public void selectionChanged(SelectionChangedEvent e) { - Object sel = ((StructuredSelection) e.getSelection()).getFirstElement(); - introTheme = (IntroTheme) sel; - themePreview.redraw(); - } - }); - loadThemes(); - Label previewLabel = new Label(rightColumn, SWT.NULL); - previewLabel.setText(Messages.WelcomeCustomizationPreferencePage_preview); - themePreview = new Canvas(rightColumn, SWT.NULL); - gd = new GridData(); - gd.widthHint = 160+20; - gd.heightHint = 120+20; - themePreview.setLayoutData(gd); - themePreview.addPaintListener(new PaintListener() { - - public void paintControl(PaintEvent e) { - if (introTheme == null) - return; - Image bgImage = introTheme.getPreviewImage(); - if (bgImage == null) - return; - //Rectangle carea = themePreview.getClientArea(); - Rectangle ibounds = bgImage.getBounds(); - e.gc.drawImage(bgImage, 0, 0, ibounds.width, ibounds.height, 10, 10, 160, 120); - } - }); - Label label = new Label(container, SWT.NULL); - label.setText(Messages.WelcomeCustomizationPreferencePage_rootpages); - gd = new GridData(); - gd.horizontalSpan = 2; - label.setLayoutData(gd); - rootPages = CheckboxTableViewer.newCheckList(container, SWT.BORDER); - rootPages.setContentProvider(contentProvider); - rootPages.setLabelProvider(labelProvider); - gd = new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL); - gd.horizontalSpan = 2; - rootPages.getControl().setLayoutData(gd); - rootPages.addCheckStateListener(new ICheckStateListener() { - - public void checkStateChanged(CheckStateChangedEvent event) { - RootPage page = (RootPage) event.getElement(); - boolean checked = event.getChecked(); - onPageChecked(page.id, checked); - } - }); - item.setControl(container); - } - - private void loadThemes() { - IConfigurationElement [] elements = Platform.getExtensionRegistry().getConfigurationElementsFor("org.eclipse.ui.intro.configExtension"); //$NON-NLS-1$ - for (int i=0; i<elements.length; i++) { - if (elements[i].getName().equals("theme")) { //$NON-NLS-1$ - themeList.add(new IntroTheme(elements[i])); - } - } - } - - private void addPage(String id) { - if (!getRootPageSelected(id)) - return; - TabItem item = new TabItem(tabFolder, SWT.NULL); - item.setText(getRootPageName(id)); - item.setControl(pageContainer); - item.setData(id); - PageData pd = introData.getPage(id); - item.setData("pageData", pd); //$NON-NLS-1$ - } - - private void onPageChecked(String id, boolean checked) { - TabItem[] items = tabFolder.getItems(); - if (checked) { - for (int i = 0; i < items.length; i++) { - TabItem item = items[i]; - if (item.getData() != null) - item.dispose(); - } - introRootPages.add(id); - addRootPages(); - } else { - for (int i = 0; i < items.length; i++) { - TabItem item = items[i]; - String itemId = (String) item.getData(); - if (itemId != null && itemId.equals(id)) { - item.dispose(); - introRootPages.remove(id); - return; - } - } - } + getContentsArea().performDefaults(); } - private String getRootPageName(String id) { - for (int i = 0; i < ROOT_PAGE_TABLE.length; i++) { - if (ROOT_PAGE_TABLE[i].id.equals(id)) - return ROOT_PAGE_TABLE[i].getName(); - } - return "?"; //$NON-NLS-1$ - } - - private boolean getRootPageSelected(String id) { - for (int i = 0; i < introRootPages.size(); i++) { - String cid = (String) introRootPages.get(i); - if (cid.equals(id)) - return true; - } - return false; - } public void setInitializationData(IConfigurationElement config, String propertyName, Object data) throws CoreException { } - private void createPopupMenu(final TableViewer viewer) { - MenuManager manager = new MenuManager(); - manager.createContextMenu(viewer.getControl()); - viewer.getControl().setMenu(manager.getMenu()); - manager.setRemoveAllWhenShown(true); - manager.addMenuListener(new IMenuListener() { - - public void menuAboutToShow(IMenuManager manager) { - fillPopupMenu(manager, viewer); - } - }); - } - - private void addDNDSupport(TableViewer viewer) { - viewer.addDragSupport(DND.DROP_MOVE, TRANSFER_TYPES, new TableDragSourceListener(viewer)); - viewer.addDropSupport(DND.DROP_MOVE, TRANSFER_TYPES, new TableDropTargetListener(viewer)); - } - - private TableViewer createTableViewer(Composite parent, String id) { - final Table table = new Table(parent, SWT.BORDER | SWT.FULL_SELECTION); - final TableColumn column1 = new TableColumn(table, SWT.NULL); - column1.setMoveable(false); - column1.setWidth(20); - column1.setResizable(false); - final TableColumn column2 = new TableColumn(table, SWT.NULL); - column2.setResizable(true); - final TableViewer viewer = new TableViewer(table); - CellEditor[] editors = new CellEditor[2]; - editors[0] = new ComboBoxCellEditor(table, ExtensionData.IMPORTANCE_NAME_TABLE, SWT.READ_ONLY); - viewer.setCellEditors(editors); - viewer.setColumnProperties(new String[] { IUniversalIntroConstants.P_IMPORTANCE, - IUniversalIntroConstants.P_NAME }); - viewer.setCellModifier(new ICellModifier() { - - public boolean canModify(Object element, String property) { - return property.equals(IUniversalIntroConstants.P_IMPORTANCE); - } - - public Object getValue(Object element, String property) { - if (element instanceof ExtensionData) { - ExtensionData ed = (ExtensionData) element; - if (property.equals(IUniversalIntroConstants.P_IMPORTANCE)) - return new Integer(ed.getImportance()); - } - return null; - } - - public void modify(Object element, String property, Object value) { - Integer ivalue = (Integer) value; - TableItem item = (TableItem) element; - ExtensionData ed = (ExtensionData) item.getData(); - ed.setImportance(ivalue.intValue()); - viewer.update(ed, new String [] {IUniversalIntroConstants.P_IMPORTANCE}); - } - }); - viewer.setContentProvider(contentProvider); - viewer.setLabelProvider(labelProvider); - viewer.setData("id", id); //$NON-NLS-1$ - createPopupMenu(viewer); - addDNDSupport(viewer); - return viewer; - } - - private void fillPopupMenu(IMenuManager manager, final TableViewer viewer) { - StructuredSelection ssel = (StructuredSelection) viewer.getSelection(); - - manager.add(new Separator()); - Action addSeparator = new Action(Messages.WelcomeCustomizationPreferencePage_addSeparator) { - public void run() { - doAddSeparator(viewer); - } - }; - - manager.add(addSeparator); - manager.add(new Separator()); - - if (ssel.size() == 1 && viewer != available) { - Action upAction = new Action(Messages.WelcomeCustomizationPreferencePage_up) { - - public void run() { - doMove(viewer, true); - } - }; - Action downAction = new Action(Messages.WelcomeCustomizationPreferencePage_down) { - - public void run() { - doMove(viewer, false); - } - }; - BaseData ed = (BaseData) ssel.getFirstElement(); - GroupData gd = (GroupData) viewer.getInput(); - upAction.setEnabled(gd.canMoveUp(ed)); - downAction.setEnabled(gd.canMoveDown(ed)); - manager.add(upAction); - manager.add(downAction); - } - if (ssel.size() > 0) { - manager.add(new Separator()); - MenuManager menu = new MenuManager(Messages.WelcomeCustomizationPreferencePage_moveTo); - addMoveToAction(menu, available, viewer, - Messages.WelcomeCustomizationPreferencePage_menu_available); - addMoveToAction(menu, topLeft, viewer, Messages.WelcomeCustomizationPreferencePage_menu_top_left); - addMoveToAction(menu, topRight, viewer, Messages.WelcomeCustomizationPreferencePage_menu_top_right); - addMoveToAction(menu, bottomLeft, viewer, Messages.WelcomeCustomizationPreferencePage_menu_bottom_left); - addMoveToAction(menu, bottomRight, viewer, Messages.WelcomeCustomizationPreferencePage_menu_bottom_right); - manager.add(menu); - - boolean addDeleteSeparator=false; - - for (Iterator iter=ssel.iterator(); iter.hasNext();) { - Object obj = iter.next(); - if (obj instanceof SeparatorData) - addDeleteSeparator=true; - else { - addDeleteSeparator=false; - break; - } - } - if (addDeleteSeparator) { - Action deleteSeparator = new Action(Messages.WelcomeCustomizationPreferencePage_removeSeparator) { - public void run() { - doRemoveSeparators(viewer); - } - }; - manager.add(deleteSeparator); - } - } - } - - private void addMoveToAction(MenuManager menu, final TableViewer target, final TableViewer source, - String name) { - if (source == target) - return; - Action action = new Action(name) { - - public void run() { - doMoveTo(source, target); - } - }; - menu.add(action); - } - - private void doMove(Viewer viewer, boolean up) { - Object obj = ((StructuredSelection) viewer.getSelection()).getFirstElement(); - GroupData gd = (GroupData) viewer.getInput(); - if (up) - gd.moveUp((BaseData) obj); - else - gd.moveDown((BaseData) obj); - viewer.refresh(); + public void init(IWorkbench workbench) { } - private void doAddSeparator(Viewer viewer) { - Object obj = ((StructuredSelection) viewer.getSelection()).getFirstElement(); - GroupData gd = (GroupData) viewer.getInput(); - if (gd == null) { - gd = createTargetGd(viewer); - viewer.setInput(gd); - } - gd.addSeparator((BaseData)obj); - viewer.refresh(); - updateColumnSizes((TableViewer)viewer); - } - - private void doRemoveSeparators(Viewer viewer) { - StructuredSelection ssel = ((StructuredSelection) viewer.getSelection()); - GroupData gd = (GroupData) viewer.getInput(); - for (Iterator iter=ssel.iterator(); iter.hasNext();) { - SeparatorData sdata = (SeparatorData)iter.next(); - gd.remove(sdata); - } - viewer.refresh(); - } - - private void doMoveTo(TableViewer source, TableViewer target) { - Object[] selObjs = ((StructuredSelection) source.getSelection()).toArray(); - GroupData sourceGd = (GroupData) source.getInput(); - GroupData targetGd = (GroupData) target.getInput(); - if (targetGd == null) { - targetGd = createTargetGd(target); - } - for (int i = 0; i < selObjs.length; i++) { - BaseData ed = (BaseData) selObjs[i]; - sourceGd.remove(ed); - targetGd.add(ed); - } - source.refresh(); - updateColumnSizes(source); - if (target.getInput() != null) - target.refresh(); - else - target.setInput(targetGd); - updateColumnSizes(target); - } - - private void updateColumnSizes(TableViewer viewer) { - TableColumn sc = viewer.getTable().getColumn(1); - sc.pack(); - } - - private GroupData createTargetGd(Viewer target) { - GroupData targetGd = null; - if (target == topLeft) - targetGd = new GroupData(PageData.P_TOP_LEFT, false); - else if (target == topRight) - targetGd = new GroupData(PageData.P_TOP_RIGHT, false); - else if (target == bottomLeft) - targetGd = new GroupData(PageData.P_BOTTOM_LEFT, false); - else if (target == bottomRight) - targetGd = new GroupData(PageData.P_BOTTOM_RIGHT, false); - else if (target == available) - targetGd = new GroupData(IUniversalIntroConstants.HIDDEN, false); - else - return null; - TabItem[] items = tabFolder.getSelection(); - PageData pd = (PageData) items[0].getData("pageData"); //$NON-NLS-1$ - if (pd == null) { - String pageId = (String)items[0].getData(); - pd = new PageData(pageId); - items[0].setData("pageData", pd); //$NON-NLS-1$ - introRootPages.add(pageId); - } - pd.add(targetGd); - return targetGd; - } - public void setCurrentPage(String pageId) { - firstPageId = pageId; - } - - private void selectFirstPage() { - if (firstPageId == null) - return; - TabItem[] items = tabFolder.getItems(); - for (int i = 0; i < items.length; i++) { - TabItem item = items[i]; - PageData pd = (PageData) item.getData("pageData"); //$NON-NLS-1$ - if (pd != null && pd.getId().equals(firstPageId)) { - tabFolder.setSelection(i); - onTabChange(item); - return; - } - } + getContentsArea().setCurrentPage(pageId); } } |