| /******************************************************************************* |
| * Copyright (c) 2009 Oracle Corporation. |
| * 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: |
| * Ian Trimble - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jst.pagedesigner.ui.dialogs; |
| |
| import java.util.ArrayList; |
| import java.util.Collections; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Set; |
| |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.runtime.IAdaptable; |
| import org.eclipse.jface.viewers.IStructuredContentProvider; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| import org.eclipse.jface.viewers.LabelProvider; |
| import org.eclipse.jface.viewers.TableViewer; |
| import org.eclipse.jface.viewers.Viewer; |
| import org.eclipse.jst.jsf.common.metadata.Model; |
| import org.eclipse.jst.jsf.common.metadata.Trait; |
| import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper; |
| import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext; |
| import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper; |
| import org.eclipse.jst.pagedesigner.PDPlugin; |
| import org.eclipse.jst.pagedesigner.dtresourceprovider.DTResourceProviderFactory; |
| import org.eclipse.jst.pagedesigner.dtresourceprovider.DTSkinManager; |
| import org.eclipse.jst.pagedesigner.dtresourceprovider.IDTResourceProvider; |
| import org.eclipse.jst.pagedesigner.dtresourceprovider.IDTSkin; |
| import org.eclipse.jst.pagedesigner.utils.EditorUtil; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.events.SelectionAdapter; |
| import org.eclipse.swt.events.SelectionEvent; |
| import org.eclipse.swt.events.SelectionListener; |
| import org.eclipse.swt.graphics.Image; |
| 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.Label; |
| import org.eclipse.ui.dialogs.PropertyPage; |
| |
| /** |
| * Property page for the Web Page Editor. |
| * |
| * @author Ian Trimble - Oracle |
| */ |
| public class WPEPropertyPage extends PropertyPage { |
| |
| private IProject project; |
| private TableViewer taglibTable; |
| private TableViewer skinsTable; |
| private Button currentButton; |
| private Map<String, IDTSkin> localCurrentSkinMap = new HashMap<String, IDTSkin>(); |
| |
| /* |
| * (non-Javadoc) |
| * @see org.eclipse.jface.dialogs.DialogPage#getDescription() |
| */ |
| @Override |
| public String getDescription() { |
| return DialogsMessages.getString("WPEPropertyPage.Description"); //$NON-NLS-1$ |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite) |
| */ |
| @Override |
| protected Control createContents(Composite parent) { |
| Composite top = new Composite(parent, SWT.NONE); |
| GridLayout topLayout = new GridLayout(2, false); |
| topLayout.marginWidth = 0; |
| top.setLayout(topLayout); |
| top.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); |
| |
| //taglibs label |
| Label taglibLabel = new Label(top, SWT.NONE); |
| taglibLabel.setText(DialogsMessages.getString("WPEPropertyPage.TagLibs.Label")); //$NON-NLS-1$ |
| taglibLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); |
| |
| //empty cell |
| new Label(top, SWT.NONE).setVisible(false); |
| |
| //taglibs list |
| taglibTable = new TableViewer(top, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); |
| taglibTable.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); |
| taglibTable.getTable().addSelectionListener(new TaglibSelectionListener()); |
| taglibTable.setContentProvider(new TaglibContentProvider()); |
| taglibTable.setLabelProvider(new TaglibLabelProvider()); |
| taglibTable.setInput(project); |
| |
| //empty cell |
| new Label(top, SWT.NONE).setVisible(false); |
| |
| //skins label |
| Label skinsLabel = new Label(top, SWT.NONE); |
| skinsLabel.setText(DialogsMessages.getString("WPEPropertyPage.Skins.Label")); //$NON-NLS-1$ |
| skinsLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); |
| |
| //empty cell |
| new Label(top, SWT.NONE).setVisible(false); |
| |
| //skins list |
| skinsTable = new TableViewer(top, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); |
| skinsTable.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); |
| skinsTable.getTable().addSelectionListener(new SkinSelectionListener()); |
| skinsTable.setContentProvider(new SkinContentProvider()); |
| skinsTable.setLabelProvider(new SkinLabelProvider()); |
| |
| //buttons |
| Composite buttons = new Composite(top, SWT.NONE); |
| GridLayout buttonsLayout = new GridLayout(1, true); |
| buttonsLayout.marginWidth = 0; |
| buttons.setLayout(buttonsLayout); |
| buttons.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); |
| currentButton = new Button(buttons, SWT.NONE); |
| currentButton.setText(DialogsMessages.getString("WPEPropertyPage.Current.Button")); //$NON-NLS-1$ |
| currentButton.addSelectionListener(new SelectionAdapter() { |
| public void widgetSelected(SelectionEvent event) { |
| String nsURI = getCurrentNSURI(); |
| IStructuredSelection selection = (IStructuredSelection)skinsTable.getSelection(); |
| IDTSkin dtSkin = (IDTSkin)selection.getFirstElement(); |
| if (dtSkin != null) { |
| localCurrentSkinMap.put(nsURI, dtSkin); |
| skinsTable.refresh(); |
| updateButtons(); |
| } |
| } |
| }); |
| updateButtons(); |
| |
| return top; |
| } |
| |
| /* |
| * (non-Javadoc) |
| * @see org.eclipse.ui.dialogs.PropertyPage#setElement(org.eclipse.core.runtime.IAdaptable) |
| */ |
| @Override |
| public void setElement(IAdaptable element) { |
| Object objElement = element.getAdapter(IProject.class); |
| if (objElement != null) { |
| project = (IProject)objElement; |
| if (taglibTable != null) { |
| taglibTable.setInput(objElement); |
| } |
| } |
| super.setElement(element); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jface.preference.PreferencePage#performDefaults() |
| */ |
| @Override |
| protected void performDefaults() { |
| List<TaglibData> taglibDataList = getTaglibDataList(); |
| for (TaglibData taglibData: taglibDataList) { |
| String nsURI = taglibData.getNSURI(); |
| IDTSkin defaultDTSkin = DTSkinManager.getInstance(project).getDefaultSkin(nsURI); |
| localCurrentSkinMap.put(nsURI, defaultDTSkin); |
| } |
| skinsTable.refresh(); |
| updateButtons(); |
| super.performDefaults(); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jface.preference.PreferencePage#performOk() |
| */ |
| @Override |
| public boolean performOk() { |
| Set keys = localCurrentSkinMap.keySet(); |
| for (Object key: keys) { |
| String nsURI = (String)key; |
| IDTSkin dtSkin = localCurrentSkinMap.get(nsURI); |
| DTSkinManager.getInstance(project).setCurrentSkin(nsURI, dtSkin); |
| } |
| EditorUtil.refreshAllWPEDesignViewers(); |
| return super.performOk(); |
| } |
| |
| private IDTSkin getLocalCurrentSkin() { |
| IDTSkin localCurrentSkin = null; |
| String nsURI = getCurrentNSURI(); |
| localCurrentSkin = localCurrentSkinMap.get(nsURI); |
| if (localCurrentSkin == null) { |
| localCurrentSkin = DTSkinManager.getInstance(project).getCurrentSkin(nsURI); |
| } |
| return localCurrentSkin; |
| } |
| |
| private String getCurrentNSURI() { |
| String nsURI = null; |
| if (skinsTable != null) { |
| Object objInput = skinsTable.getInput(); |
| if (objInput instanceof TaglibData) { |
| nsURI = ((TaglibData)objInput).getNSURI(); |
| } |
| } |
| return nsURI; |
| } |
| |
| private List<TaglibData> getTaglibDataList() { |
| List<TaglibData> taglibDataList = new ArrayList<TaglibData>(); |
| List<IDTResourceProvider> resourceProviders = |
| DTResourceProviderFactory.getInstance().getActiveDTResourceProviders(project); |
| for (IDTResourceProvider resourceProvider: resourceProviders) { |
| TaglibData taglibData = new TaglibData(resourceProvider.getId()); |
| if (!taglibDataList.contains(taglibData)) { |
| taglibDataList.add(taglibData); |
| } |
| } |
| return taglibDataList; |
| } |
| |
| private void updateButtons() { |
| boolean currentButtonEnabled = false; |
| if (skinsTable != null) { |
| IStructuredSelection selection = (IStructuredSelection)skinsTable.getSelection(); |
| if (selection != null) { |
| Object selectedObject = selection.getFirstElement(); |
| if (selectedObject instanceof IDTSkin) { |
| IDTSkin localCurrentSkin = getLocalCurrentSkin(); |
| if ((IDTSkin)selectedObject != localCurrentSkin) { |
| currentButtonEnabled = true; |
| } |
| } |
| } |
| } |
| currentButton.setEnabled(currentButtonEnabled); |
| } |
| |
| |
| |
| /** |
| * Content provider for taglib table viewer. |
| */ |
| private class TaglibContentProvider implements IStructuredContentProvider { |
| /* |
| * (non-Javadoc) |
| * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) |
| */ |
| public Object[] getElements(Object inputElement) { |
| return getTaglibDataList().toArray(); |
| } |
| /* |
| * (non-Javadoc) |
| * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) |
| */ |
| public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { |
| viewer.refresh(); |
| } |
| /* |
| * (non-Javadoc) |
| * @see org.eclipse.jface.viewers.IContentProvider#dispose() |
| */ |
| public void dispose() { |
| //nothing to dispose |
| } |
| } |
| |
| |
| |
| /** |
| * Label provider for taglib table viewer. |
| */ |
| private class TaglibLabelProvider extends LabelProvider { |
| /* |
| * (non-Javadoc) |
| * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object) |
| */ |
| public Image getImage(Object element) { |
| Image image = null; |
| if (element instanceof TaglibData) { |
| image = PDPlugin.getDefault().getImage("library_obj.gif"); //$NON-NLS-1$ |
| } |
| return image; |
| } |
| /* |
| * (non-Javadoc) |
| * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object) |
| */ |
| public String getText(Object element) { |
| String text = null; |
| if (element instanceof TaglibData) { |
| TaglibData taglibData = ((TaglibData)element); |
| if (taglibData.getName() != null) { |
| text = taglibData.getName(); |
| } else { |
| text = taglibData.getNSURI(); |
| } |
| } |
| return text; |
| } |
| } |
| |
| |
| |
| private class TaglibSelectionListener implements SelectionListener { |
| /* |
| * (non-Javadoc) |
| * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent) |
| */ |
| public void widgetSelected(SelectionEvent event) { |
| Object obj = event.item.getData(); |
| if (obj instanceof TaglibData) { |
| skinsTable.setInput(obj); |
| } |
| } |
| /* |
| * (non-Javadoc) |
| * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent) |
| */ |
| public void widgetDefaultSelected(SelectionEvent event) { |
| widgetSelected(event); |
| } |
| } |
| |
| |
| |
| /** |
| * Used to hold and pass taglib-related data. |
| */ |
| private class TaglibData { |
| private String nsURI; |
| private String name; |
| public TaglibData(String nsURI) { |
| this.nsURI = nsURI; |
| ITaglibDomainMetaDataModelContext modelContext = TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(project, nsURI); |
| Model model = TaglibDomainMetaDataQueryHelper.getModel(modelContext); |
| Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(model, "display-label"); //$NON-NLS-1$ |
| this.name = TraitValueHelper.getValueAsString(trait); |
| } |
| public String getNSURI() { |
| return nsURI; |
| } |
| public String getName() { |
| return name; |
| } |
| /* |
| * (non-Javadoc) |
| * @see java.lang.Object#hashCode() |
| */ |
| public int hashCode() { |
| int nsURIHashCode = 0; |
| if (nsURI != null) { |
| nsURIHashCode = nsURI.hashCode(); |
| } |
| int nameHashCode = 0; |
| if (name != null) { |
| nameHashCode = name.hashCode(); |
| } |
| return nameHashCode | nsURIHashCode ; |
| } |
| } |
| |
| |
| |
| /** |
| * Content provider for skin table viewer. |
| */ |
| private class SkinContentProvider implements IStructuredContentProvider { |
| /* |
| * (non-Javadoc) |
| * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) |
| */ |
| public Object[] getElements(Object inputElement) { |
| List<IDTSkin> skinList; |
| if (inputElement instanceof TaglibData) { |
| skinList = DTSkinManager.getInstance(project).getSkins(((TaglibData)inputElement).getNSURI()); |
| } else { |
| skinList = Collections.EMPTY_LIST; |
| } |
| return skinList.toArray(); |
| } |
| /* |
| * (non-Javadoc) |
| * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) |
| */ |
| public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { |
| viewer.refresh(); |
| updateButtons(); |
| } |
| /* |
| * (non-Javadoc) |
| * @see org.eclipse.jface.viewers.IContentProvider#dispose() |
| */ |
| public void dispose() { |
| //nothing to dispose |
| } |
| } |
| |
| |
| |
| /** |
| * Label provider for skin table viewer. |
| */ |
| private class SkinLabelProvider extends LabelProvider { |
| /* |
| * (non-Javadoc) |
| * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object) |
| */ |
| public Image getImage(Object element) { |
| Image image = null; |
| if (element instanceof IDTSkin) { |
| image = PDPlugin.getDefault().getImage("skin.png"); //$NON-NLS-1$ |
| } |
| return image; |
| } |
| /* |
| * (non-Javadoc) |
| * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object) |
| */ |
| public String getText(Object element) { |
| String text = null; |
| if (element instanceof IDTSkin) { |
| IDTSkin dtSkin = (IDTSkin)element; |
| text = dtSkin.getName(); |
| if (dtSkin == getLocalCurrentSkin()) { |
| text += " " + DialogsMessages.getString("WPEPropertyPage.Skins.Item.Current"); //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| } |
| return text; |
| } |
| } |
| |
| |
| |
| private class SkinSelectionListener implements SelectionListener { |
| /* |
| * (non-Javadoc) |
| * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent) |
| */ |
| public void widgetSelected(SelectionEvent event) { |
| updateButtons(); |
| } |
| /* |
| * (non-Javadoc) |
| * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent) |
| */ |
| public void widgetDefaultSelected(SelectionEvent event) { |
| widgetSelected(event); |
| } |
| } |
| |
| } |