//------------------------------------------------------------------------------ // Copyright (c) 2005, 2007 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 implementation //------------------------------------------------------------------------------ package org.eclipse.epf.authoring.ui.forms; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.eclipse.emf.common.notify.AdapterFactory; import org.eclipse.emf.edit.provider.ITreeItemContentProvider; import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider; import org.eclipse.epf.authoring.ui.AuthoringUIHelpContexts; import org.eclipse.epf.authoring.ui.AuthoringUIPlugin; import org.eclipse.epf.authoring.ui.AuthoringUIResources; import org.eclipse.epf.authoring.ui.dialogs.ConfigurationAddViewsDialog; import org.eclipse.epf.authoring.ui.dialogs.ConfigurationOrderDialog; import org.eclipse.epf.authoring.ui.editors.ConfigurationEditor; import org.eclipse.epf.authoring.ui.editors.ConfigurationEditorInput; import org.eclipse.epf.authoring.ui.filters.ProcessViewFilter; import org.eclipse.epf.authoring.ui.providers.ConfigurationLabelProvider; import org.eclipse.epf.authoring.ui.views.ConfigurationViewFilter; import org.eclipse.epf.common.serviceability.Logger; import org.eclipse.epf.library.edit.IFilter; import org.eclipse.epf.library.edit.TngAdapterFactory; import org.eclipse.epf.library.edit.command.IActionManager; import org.eclipse.epf.library.edit.itemsfilter.FilterConstants; import org.eclipse.epf.uma.ContentCategory; import org.eclipse.epf.uma.MethodConfiguration; import org.eclipse.epf.uma.UmaPackage; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.forms.FormColors; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.editor.FormEditor; import org.eclipse.ui.forms.editor.FormPage; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.forms.widgets.Section; /** * Page for customizing publishing views * * @author Shilpa Toraskar * @author Jinhua Xi * @since 1.0 * fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=173827 * fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=174260 */ public class ConfigViewPage extends FormPage { private MethodConfiguration config = null; private String formPrefix = AuthoringUIResources.configViewPage_configuration; private FormToolkit toolkit; private CTabFolder tabFolder; private CTabItem tabDefaultviewItem; private Button removeButton, makeDefaultButton, orderButton; private Object selectedItem = null; private IActionManager actionMgr = null; private Logger logger = null; /** * Creates an instance * @param editor */ public ConfigViewPage(FormEditor editor) { super( editor, AuthoringUIResources.configViewPage_configurationViews, AuthoringUIResources.configViewPage_views); } /** * @see org.eclipse.ui.forms.editor.FormPage#init(org.eclipse.ui.IEditorSite, org.eclipse.ui.IEditorInput) */ public void init(IEditorSite site, IEditorInput input) { setSite(site); setInput(input); ConfigurationEditorInput configInput = (ConfigurationEditorInput) input; config = configInput.getConfiguration(); actionMgr = ((ConfigurationEditor) getEditor()).getActionManager(); // get plugin logger logger = AuthoringUIPlugin.getDefault().getLogger(); } /** * @see org.eclipse.ui.forms.editor.FormPage#createFormContent(org.eclipse.ui.forms.IManagedForm) */ protected void createFormContent(IManagedForm managedForm) { ScrolledForm form = managedForm.getForm(); form.setText(formPrefix + config.getName()); toolkit = managedForm.getToolkit(); form.getBody().setLayout(new GridLayout()); // Create the view section. Section viewSection = toolkit.createSection(form.getBody(), Section.DESCRIPTION | Section.TWISTIE | Section.EXPANDED | Section.TITLE_BAR); GridData td = new GridData(GridData.FILL_BOTH); viewSection.setLayoutData(td); viewSection .setText(AuthoringUIResources.configViewPage_configurationViewSectionTitle); viewSection .setDescription(AuthoringUIResources.configViewPage_configurationViewSectionMessage); viewSection.setLayout(new GridLayout()); Composite parent = toolkit.createComposite(viewSection); parent.setLayoutData(new GridData(GridData.FILL_BOTH)); parent.setLayout(new GridLayout()); viewSection.setClient(parent); PlatformUI.getWorkbench().getHelpSystem().setHelp(parent.getParent(), AuthoringUIHelpContexts.CONFIGURATION_EDITOR_ALL_CONTEXT); // create button pane createButtonPane(parent); // create tabfolder pane createTabPane(parent); toolkit.paintBordersFor(parent); loadData(); } /** * * @param parent */ private void createTabPane(Composite parent) { tabFolder = new CTabFolder(parent, SWT.FLAT | SWT.TOP | SWT.BORDER); tabFolder.setLayout(new GridLayout()); tabFolder.setLayoutData(new GridData(GridData.FILL_BOTH)); // set tabfolder background color Color selectedColor = toolkit.getColors().getColor(FormColors.TB_BG); tabFolder.setSelectionBackground(new Color[] { selectedColor, toolkit.getColors().getBackground() }, new int[] { 50 }); toolkit.paintBordersFor(tabFolder); } /** * * @param parent */ private void createButtonPane(Composite parent) { Composite buttonPane = toolkit.createComposite(parent); buttonPane.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); buttonPane.setLayout(new GridLayout(4, false)); Button addButton = toolkit .createButton( buttonPane, AuthoringUIResources.configViewPage_addViewButtonText, SWT.NONE); { GridData gridData = new GridData(GridData.BEGINNING); addButton.setLayoutData(gridData); } addButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { // ConfigProcessViewDialog fd = new // ConfigProcessViewDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), // config); // ConfigProcessViewDialog.setDefaultImage(Display.getCurrent().getActiveShell().getImage()); IFilter filter = new ProcessViewFilter(config, null, FilterConstants.ALL_ELEMENTS); ConfigurationAddViewsDialog fd = new ConfigurationAddViewsDialog( PlatformUI.getWorkbench().getActiveWorkbenchWindow() .getShell()); fd.setTypes(getTypes()); fd .setTitle(AuthoringUIResources.ConfigProcessViewDialog_SelectCategories); fd.setInput(config); fd.setFilter(filter); fd.setExistingElements(config.getProcessViews()); fd.setContentProvider(new AdapterFactoryContentProvider( TngAdapterFactory.INSTANCE .getItemsFilter_AdapterFactory(filter)), TngAdapterFactory.INSTANCE.getItemsFilter_ComposedAdapterFactory()); fd.setBlockOnOpen(true); fd.open(); List views = fd.getSelectedItems(); // add view to configuration for (Iterator itor = views.iterator(); itor.hasNext();) { Object obj = itor.next(); if (obj instanceof ContentCategory) { if (config.getProcessViews().contains( (ContentCategory) obj)) { String name = ((ContentCategory) obj).getName(); String title = AuthoringUIResources.configViewPageViewExistsDialog_title; String message = AuthoringUIResources.bind(AuthoringUIResources.configViewPageViewExistsDialog_message, name); AuthoringUIPlugin.getDefault().getMsgDialog() .displayWarning(title, message); } else { boolean status = actionMgr .doAction( IActionManager.ADD, config, UmaPackage.eINSTANCE .getMethodConfiguration_ProcessViews(), (ContentCategory) obj, -1); if(status){ addView((ContentCategory) obj); } } } } } }); // remove button removeButton = toolkit .createButton( buttonPane, AuthoringUIResources.configViewPage_removeViewButtonText, SWT.NONE); { GridData gridData = new GridData(GridData.BEGINNING); removeButton.setLayoutData(gridData); } removeButton.setEnabled(false); removeButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { removeView(); } }); // make default button makeDefaultButton = toolkit .createButton( buttonPane, AuthoringUIResources.configViewPage_makeDefaultButtonText, SWT.NONE); { GridData gridData = new GridData(GridData.BEGINNING); makeDefaultButton.setLayoutData(gridData); } makeDefaultButton.setEnabled(false); makeDefaultButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { makeDefaultView(); } }); orderButton = toolkit.createButton( buttonPane, AuthoringUIResources.orderButton_text, SWT.NONE); { GridData gridData = new GridData(GridData.BEGINNING); removeButton.setLayoutData(gridData); } orderButton.addSelectionListener(new SelectionAdapter(){ public void widgetSelected(SelectionEvent e) { ConfigurationOrderDialog dlg = new ConfigurationOrderDialog( Display.getCurrent().getActiveShell(), config, getActionManager()); int ret = dlg.open(); if(ret == Window.OK) refresh(); } }); toolkit.paintBordersFor(buttonPane); } /** * Remove the selected view * */ private void removeView() { CTabItem item = tabFolder.getSelection(); if (item == null) return; // don't change default view if the view is not removed. // 155025 - error when removing the view in configuration String itemText = item.getText(); String title = AuthoringUIResources.configViewPageRemoveViewDialog_title; String message = AuthoringUIResources.bind(AuthoringUIResources.configViewPageRemoveViewDialog_message, item .getText()); boolean ret = AuthoringUIPlugin.getDefault().getMsgDialog() .displayConfirmation(title, message); if (!ret) { return; } boolean removeDefault = false; if (tabDefaultviewItem != null && item == tabDefaultviewItem) { removeDefault = true; } List views = config.getProcessViews(); // if there is a default view tab, and it's the one slected to be removed if (removeDefault) { String defaultText = " " //$NON-NLS-1$ + AuthoringUIResources.processDescription_default; int idx = itemText.lastIndexOf(defaultText); if (idx > 0) { itemText = itemText.substring(0,idx); } } for (Iterator itor = views.iterator(); itor.hasNext();) { ContentCategory category = (ContentCategory) itor.next(); if (category.getName().equals(itemText)) { // remove it from views actionMgr.doAction(IActionManager.REMOVE, config, UmaPackage.eINSTANCE .getMethodConfiguration_ProcessViews(), category, -1); ContentCategory defaultView = config.getDefaultView(); if ((defaultView != null) && (defaultView.equals(category))) { if (views.size() > 0) { actionMgr .doAction( IActionManager.SET, config, UmaPackage.eINSTANCE .getMethodConfiguration_DefaultView(), (ContentCategory) views.get(0), -1); } else { actionMgr .doAction( IActionManager.SET, config, UmaPackage.eINSTANCE .getMethodConfiguration_DefaultView(), null, -1); } } // remove tab item item.dispose(); break; } } views = config.getProcessViews(); if ((views == null) || (views.size() <= 0)) { removeButton.setEnabled(false); makeDefaultButton.setEnabled(false); } // make the 1st tab as the default view if the default one is removed if (removeDefault) { Control[] tabList = tabFolder.getTabList(); if (tabList != null && tabList.length > 0) { tabFolder.setSelection(0); makeDefaultView(); } } } /** * Add view * * @param obj */ private void addView(ContentCategory obj) { selectedItem = obj; Composite composite = new Composite(tabFolder, SWT.NONE); GridLayout layout = new GridLayout(); layout.marginHeight = 0; layout.marginWidth = 0; composite.setLayout(layout); composite.setLayoutData(new GridData(GridData.FILL_BOTH)); TreeViewer treeViewer = new TreeViewer(composite, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); treeViewer.getTree().setLayout(new GridLayout()); treeViewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH)); IFilter configFilter = new ConfigurationViewFilter(config, treeViewer); AdapterFactory adapterFactory = TngAdapterFactory.INSTANCE .getConfigurationView_AdapterFactory(configFilter); AdapterFactoryContentProvider contentProvider = new AdapterFactoryContentProvider( adapterFactory) { public Object[] getElements(Object object) { // Get the adapter from the factory. ITreeItemContentProvider itemProvider = (ITreeItemContentProvider) adapterFactory .adapt(selectedItem, ITreeItemContentProvider.class); return itemProvider.getChildren(selectedItem).toArray(); // return itemProvider.getElements(selectedItem).toArray(); } }; treeViewer.setContentProvider(contentProvider); treeViewer.setLabelProvider(new ConfigurationLabelProvider(config, adapterFactory)); try { treeViewer.setInput(config); } catch (Exception ex) { logger.logError("Error creating treeviewer for config", ex); //$NON-NLS-1$ } CTabItem item = new CTabItem(tabFolder, SWT.TOP); item.setText(((ContentCategory) obj).getName()); item.setControl(composite); // make all buttons enabled removeButton.setEnabled(true); makeDefaultButton.setEnabled(true); toolkit.paintBordersFor(composite); tabFolder.setSelection(item); } /** * Make selected as default view * */ private void makeDefaultView() { CTabItem item = tabFolder.getSelection(); List views = config.getProcessViews(); for (Iterator itor = views.iterator(); itor.hasNext();) { ContentCategory category = (ContentCategory) itor.next(); if (category.getName().equals(item.getText())) { clearDefaultViewIndicator(); // make that view default actionMgr.doAction(IActionManager.SET, config, UmaPackage.eINSTANCE .getMethodConfiguration_DefaultView(), category, -1); setDefaultViewIndicator(item); break; } } } /** * Load initial data * */ private void loadData() { // get process views List views = config.getProcessViews(); for (Iterator itor = views.iterator(); itor.hasNext();) { // create view in UI addView((ContentCategory) itor.next()); } // get default view ContentCategory defaultView = config.getDefaultView(); int cnt = tabFolder.getItemCount(); if (defaultView != null) { // if default view is defined, select that view CTabItem[] items = tabFolder.getItems(); for (int i = 0; i < items.length; i++) { String name = items[i].getText(); if (name.equals(defaultView.getName())) { tabFolder.setSelection(items[i]); setDefaultViewIndicator(items[i]); break; } } } else if (cnt > 0) { // else select first view tabFolder.setSelection(0); } } private void refresh(){ ContentCategory defaultView = config.getDefaultView(); String defaultViewName = ""; //$NON-NLS-1$ if(defaultView!=null) { defaultViewName = defaultView.getName(); clearDefaultViewIndicator(); } String selectedView = tabFolder.getSelection().getText(); Map origViews = new HashMap(); for(int i=0;i<tabFolder.getItemCount();i++){ CTabItem item = tabFolder.getItem(i); origViews.put(item.getText(), item.getControl()); } List views = config.getProcessViews(); int index = 0; int selectedIndex = 0; for (Iterator itor = views.iterator(); itor.hasNext() && index<tabFolder.getItemCount();) { String view = ((ContentCategory)itor.next()).getName(); CTabItem item = tabFolder.getItem(index++); item.setText(view); item.setControl((Control)origViews.get(view)); if(view.equals(defaultViewName)) setDefaultViewIndicator(item); if(view.equals(selectedView)) selectedIndex = index-1; } tabFolder.setSelection(selectedIndex); } /** * This method removes the appended "(default)" from the tab for the default * view. This method must be called before changing the default view! */ private void clearDefaultViewIndicator() { ContentCategory defaultView = config.getDefaultView(); if (defaultView != null) { String defaultViewTabName = defaultView.getName() + " " //$NON-NLS-1$ + AuthoringUIResources.processDescription_default; CTabItem[] items = tabFolder.getItems(); for (int i = 0; i < items.length; i++) { String name = items[i].getText(); if (name.equals(defaultViewTabName)) { items[i].setText(defaultView.getName()); } } } } /** * This method appends "(default)" to the tab of the default view. */ private void setDefaultViewIndicator(CTabItem item) { tabDefaultviewItem = item; String name = item.getText() + " " //$NON-NLS-1$ + AuthoringUIResources.processDescription_default; item.setText(name); } private String[] getTypes() { String[] Categories = new String[] { FilterConstants.CUSTOM_CATEGORIES, FilterConstants.ALL_ELEMENTS, FilterConstants.DISCIPLINES, FilterConstants.DOMAINS, FilterConstants.ROLESETS, FilterConstants.WORKPRODUCTTYPES, FilterConstants.TOOLS }; return Categories; } protected IActionManager getActionManager() { return actionMgr; } }