Java tutorial
/** * Aptana Studio * Copyright (c) 2005-2012 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the GNU Public License (GPL) v3 (with exceptions). * Please see the license.html included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ package com.aptana.editor.common.preferences; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ProjectScope; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.preference.BooleanFieldEditor; import org.eclipse.jface.preference.ComboFieldEditor; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Table; import com.aptana.core.CoreStrings; import com.aptana.core.IUserAgent; import com.aptana.core.logging.IdeLog; import com.aptana.core.util.ArrayUtil; import com.aptana.core.util.CollectionsUtil; import com.aptana.core.util.ResourceUtil; import com.aptana.core.util.StringUtil; import com.aptana.editor.common.CommonEditorPlugin; import com.aptana.editor.common.CommonSourceViewerConfiguration; import com.aptana.editor.common.contentassist.UserAgentFilterType; import com.aptana.editor.common.contentassist.UserAgentManager; import com.aptana.ui.preferences.AptanaPreferencePage; import com.aptana.ui.preferences.PropertyAndPreferenceFieldEditorPage; /** * UserAgentPreferencePage */ public class ContentAssistPreferencePage extends PropertyAndPreferenceFieldEditorPage { private static final String PREFERENCE_PAGE_ID = "com.aptana.editor.common.contentAssistPreferencePage"; //$NON-NLS-1$ private static final String PROPERTY_PAGE_ID = "com.aptana.editor.common.contentAssistPropertyPage"; //$NON-NLS-1$ private Combo natureCombo; private String activeNatureID; private CheckboxTableViewer categoryViewer; private SortedMap<String, String> natureIDsByName; private Map<String, IUserAgent[]> userAgentsByNatureID; /** * UserAgentPreferencePage */ public ContentAssistPreferencePage() { super(GRID); setPreferenceStore(CommonEditorPlugin.getDefault().getPreferenceStore()); setDescription(Messages.ContentAssistPreferencePage_ContentAssistPreferencePageDescription); } /** * createFieldEditors */ public void createFieldEditors() { Composite parent = getFieldEditorParent(); // create user agent group Composite uaGroup = AptanaPreferencePage.createGroup(parent, Messages.ContentAssistPreferencePage_UserAgentGroupLabel); createUserAgentGroupContent(uaGroup); if (!isProjectPreferencePage()) { // create proposal group Composite pGroup = AptanaPreferencePage.createGroup(parent, Messages.ContentAssistPreferencePage_ProposalsGroupLabel); createProposalGroupContent(pGroup); } } /** * createFilterSelector * * @param parent */ protected void createFilterSelector(Composite parent) { // @formatter:off ComboFieldEditor fieldEditor = new ComboFieldEditor( com.aptana.editor.common.contentassist.IPreferenceConstants.CONTENT_ASSIST_USER_AGENT_FILTER_TYPE, Messages.ContentAssistPreferencePage_ProposalFilterTypeLabel, new String[][] { { Messages.ContentAssistPreferencePage_NoFilterLabel, UserAgentFilterType.NO_FILTER.getText() }, { Messages.ContentAssistPreferencePage_OneOrMoreFilterLabel, UserAgentFilterType.ONE_OR_MORE.getText() }, { Messages.ContentAssistPreferencePage_AllFilterLabel, UserAgentFilterType.ALL.getText() } }, parent); addField(fieldEditor); // @formatter:on // We only want to enable this field editor for workspace-specific settings. // Since the UI will not draw anything unless we have at least one field-editor in this page, we have to add it // and disable it for project-specific. fieldEditor.setEnabled(!isProjectPreferencePage(), parent); } /** * createNatureSelector * * @param parent */ protected void createNatureSelector(Composite parent) { // grab nature label+id list SortedMap<String, String> natureMap = getNatureMap(); // combo label Label label = new Label(parent, SWT.LEFT); label.setFont(parent.getFont()); label.setText(Messages.ContentAssistPreferencePage_NatureComboLabel); // create combo natureCombo = new Combo(parent, SWT.READ_ONLY); natureCombo.setFont(parent.getFont()); GridData gd = new GridData(); gd.horizontalSpan = 1; gd.horizontalAlignment = GridData.FILL; natureCombo.setLayoutData(gd); // Selected nature, in case it's a property page. boolean isProjectPreference = isProjectPreferencePage(); String primaryProjectNature = null; if (isProjectPreference) { try { String[] aptanaNatures = ResourceUtil.getAptanaNatures(getProject().getDescription()); if (!ArrayUtil.isEmpty(aptanaNatures)) { primaryProjectNature = aptanaNatures[0]; } } catch (CoreException e) { } } // set combo list for (Map.Entry<String, String> entry : natureMap.entrySet()) { if (primaryProjectNature != null) { // Select only the matching entry if (primaryProjectNature.equals(entry.getValue())) { natureCombo.add(entry.getKey()); break; } } else { natureCombo.add(entry.getKey()); } } // select first item and save reference to that nature id for future selection updates natureCombo.select(0); activeNatureID = natureMap.get(natureCombo.getText()); natureCombo.setEnabled(!isProjectPreference); if (!isProjectPreference) { natureCombo.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent evt) { // update selection in model userAgentsByNatureID.put(activeNatureID, getSelectedUserAgents()); // update nature id activeNatureID = getNatureMap().get(natureCombo.getText()); // update visible selection updateUserAgentSelection(); } }); } } /** * createProposalGroupContent * * @param parent */ protected void createProposalGroupContent(Composite parent) { // @formatter:off addField(new BooleanFieldEditor(IPreferenceConstants.CONTENT_ASSIST_AUTO_INSERT, Messages.EditorsPreferencePage_Content_Assist_Auto_Insert, parent)); addField(new ComboFieldEditor(IPreferenceConstants.CONTENT_ASSIST_DELAY, Messages.EditorsPreferencePage_Content_Assist_Auto_Display, new String[][] { { Messages.EditorsPreferencePage_Instant, Integer.toString(CommonSourceViewerConfiguration.NO_CONTENT_ASSIST_DELAY) }, { Messages.EditorsPreferencePage_DefaultDelay, Integer.toString(CommonSourceViewerConfiguration.DEFAULT_CONTENT_ASSIST_DELAY) }, { Messages.EditorsPreferencePage_Content_Assist_Short_Delay, Integer.toString(CommonSourceViewerConfiguration.LONG_CONTENT_ASSIST_DELAY) }, { CoreStrings.OFF, String.valueOf(CommonSourceViewerConfiguration.CONTENT_ASSIST_OFF_DELAY) } }, parent)); addField(new ComboFieldEditor(IPreferenceConstants.CONTENT_ASSIST_HOVER, Messages.EditorsPreferencePage_Content_Assist_Hover, new String[][] { { CoreStrings.ON, Boolean.toString(true) }, { CoreStrings.OFF, Boolean.toString(false) } }, parent)); // @formatter:on } /** * createUserAgentButtons * * @param parent */ protected void createUserAgentButtons(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); composite.setLayout(GridLayoutFactory.fillDefaults().numColumns(4).create()); composite.setLayoutData(GridDataFactory.fillDefaults().span(2, 0).grab(true, false).create()); Button enableAll = new Button(composite, SWT.PUSH); enableAll.setFont(parent.getFont()); enableAll.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { categoryViewer.setCheckedElements(UserAgentManager.getInstance().getAllUserAgents()); } }); enableAll.setText(Messages.UserAgentPreferencePage_Select_All); setButtonLayoutData(enableAll); Button disableAll = new Button(composite, SWT.PUSH); disableAll.setFont(parent.getFont()); disableAll.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { categoryViewer.setCheckedElements(new Object[0]); } }); disableAll.setText(Messages.UserAgentPreferencePage_Select_None); setButtonLayoutData(disableAll); } /** * createUserAgentGroupContent * * @param parent */ protected void createUserAgentGroupContent(Composite parent) { createNatureSelector(parent); createUserAgentTable(parent); createUserAgentButtons(parent); createFilterSelector(parent); UserAgentManager manager = UserAgentManager.getInstance(); // initialize nature to user agent map userAgentsByNatureID = new HashMap<String, IUserAgent[]>(); if (isProjectPreferencePage()) { try { IProject project = getProject(); String[] aptanaNatures = ResourceUtil.getAptanaNatures(project.getDescription()); if (!ArrayUtil.isEmpty(aptanaNatures)) { userAgentsByNatureID.put(aptanaNatures[0], manager.getActiveUserAgents(project)); } } catch (CoreException e) { IdeLog.logError(CommonEditorPlugin.getDefault(), e); } } else { // Filter selection only visible on the workspace setting level. for (String natureID : ResourceUtil.getAptanaNaturesMap().values()) { userAgentsByNatureID.put(natureID, manager.getActiveUserAgents(natureID)); } } updateUserAgentSelection(); } /** * createUserAgentTable * * @param parent */ protected void createUserAgentTable(Composite parent) { Label label = new Label(parent, SWT.WRAP); label.setText(Messages.UserAgentPreferencePage_Select_User_Agents); label.setLayoutData(GridDataFactory.fillDefaults().span(2, 0).grab(true, true).create()); Composite composite = new Composite(parent, SWT.NONE); composite.setLayout(GridLayoutFactory.fillDefaults().create()); composite.setLayoutData(GridDataFactory.fillDefaults().span(2, 0).hint(400, 120).grab(true, true).create()); Table table = new Table(composite, SWT.CHECK | SWT.BORDER | SWT.SINGLE); table.setFont(parent.getFont()); categoryViewer = new CheckboxTableViewer(table); categoryViewer.getControl().setFont(parent.getFont()); categoryViewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH)); categoryViewer.setContentProvider(ArrayContentProvider.getInstance()); CategoryLabelProvider categoryLabelProvider = new CategoryLabelProvider(true); categoryViewer.setLabelProvider(categoryLabelProvider); categoryViewer.setComparator(new ViewerComparator() { @Override public int compare(Viewer viewer, Object e1, Object e2) { if (e1 instanceof IUserAgent && e2 instanceof IUserAgent) { IUserAgent ua1 = (IUserAgent) e1; IUserAgent ua2 = (IUserAgent) e2; String uaName1 = StringUtil.getStringValue(ua1.getName()); String uaName2 = StringUtil.getStringValue(ua2.getName()); return uaName1.compareToIgnoreCase(uaName2); } return super.compare(viewer, e1, e2); } }); categoryViewer.setInput(UserAgentManager.getInstance().getAllUserAgents()); } /** * getNatures * * @return */ protected SortedMap<String, String> getNatureMap() { if (natureIDsByName == null) { natureIDsByName = new TreeMap<String, String>(ResourceUtil.getAptanaNaturesMap()); } return natureIDsByName; } /** * getSelectedUserAgents * * @return */ protected IUserAgent[] getSelectedUserAgents() { Object[] elements = categoryViewer.getCheckedElements(); IUserAgent[] userAgents = new IUserAgent[elements.length]; for (int i = 0; i < elements.length; i++) { userAgents[i] = (IUserAgent) elements[i]; } return userAgents; } /* * (non-Javadoc) * @see org.eclipse.jface.preference.FieldEditorPreferencePage#performDefaults() */ @Override protected void performDefaults() { userAgentsByNatureID = new HashMap<String, IUserAgent[]>(); UserAgentManager manager = UserAgentManager.getInstance(); for (String natureID : ResourceUtil.getAptanaNaturesMap().values()) { userAgentsByNatureID.put(natureID, manager.getDefaultUserAgents(natureID)); } updateUserAgentSelection(); super.performDefaults(); } /* * (non-Javadoc) * @see org.eclipse.jface.preference.FieldEditorPreferencePage#performOk() */ @Override public boolean performOk() { // update selection in model userAgentsByNatureID.put(activeNatureID, getSelectedUserAgents()); // set active user agents for all natures UserAgentManager manager = UserAgentManager.getInstance(); IProject project = getProject(); if (project == null) { for (Map.Entry<String, IUserAgent[]> entry : userAgentsByNatureID.entrySet()) { String natureID = entry.getKey(); IUserAgent[] userAgents = entry.getValue(); String[] userAgentIDs = new String[userAgents.length]; for (int i = 0; i < userAgents.length; i++) { userAgentIDs[i] = userAgents[i].getID(); } manager.setActiveUserAgents(natureID, userAgentIDs); // Write changes to preferences (workspace scope) manager.savePreference(); } } else if (useProjectSettings()) { // Write changes to preferences (project-scope). if (activeNatureID != null && !CollectionsUtil.isEmpty(userAgentsByNatureID)) { IUserAgent[] userAgents = userAgentsByNatureID.get(activeNatureID); String[] userAgentIDs = new String[userAgents.length]; for (int i = 0; i < userAgents.length; i++) { userAgentIDs[i] = userAgents[i].getID(); } manager.savePreference(project, CollectionsUtil.newTypedMap(String.class, String[].class, activeNatureID, userAgentIDs)); } else { IdeLog.logWarning(CommonEditorPlugin.getDefault(), "ContentAssist preferences - Did not save. Expected to have a valid Aptana nature"); //$NON-NLS-1$ } } else { // This is a project property page. However, the user have no selection to enable a project-specific. // We need to make sure that the project-scope preferences are cleared. manager.clearPreferences(project); } return super.performOk(); } /** * updateUserAgentSelection */ private void updateUserAgentSelection() { String name = natureCombo.getText(); String natureID = natureIDsByName.get(name); IUserAgent[] userAgents = userAgentsByNatureID.get(natureID); categoryViewer.setCheckedElements(userAgents != null ? userAgents : UserAgentManager.NO_USER_AGENTS); } /* * (non-Javadoc) * @see * com.aptana.ui.preferences.PropertyAndPreferenceFieldEditorPage#hasProjectSpecificOptions(org.eclipse.core.resources * .IProject ) */ @Override protected boolean hasProjectSpecificOptions(IProject project) { ProjectScope scope = new ProjectScope(project); IEclipsePreferences node = scope.getNode(CommonEditorPlugin.PLUGIN_ID); if (node != null) { return node.get(com.aptana.editor.common.contentassist.IPreferenceConstants.USER_AGENT_PREFERENCE, null) != null; } return false; } /* * (non-Javadoc) * @see com.aptana.ui.preferences.PropertyAndPreferenceFieldEditorPage#getPreferencePageId() */ @Override protected String getPreferencePageId() { return PREFERENCE_PAGE_ID; } /* * (non-Javadoc) * @see com.aptana.ui.preferences.PropertyAndPreferenceFieldEditorPage#getNatureIDs() */ protected Set<String> getNatureIDs() { return new HashSet<String>(ResourceUtil.getAptanaNaturesMap().values()); } /* * (non-Javadoc) * @see com.aptana.ui.preferences.PropertyAndPreferenceFieldEditorPage#getPropertyPageId() */ @Override protected String getPropertyPageId() { return PROPERTY_PAGE_ID; } private class CategoryLabelProvider extends LabelProvider implements ITableLabelProvider { /** * @param decorate */ public CategoryLabelProvider(boolean decorate) { } /** * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int) */ public Image getColumnImage(Object element, int columnIndex) { return UserAgentManager.getInstance().getImage(((IUserAgent) element).getEnabledIconPath()); } /** * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int) */ public String getColumnText(Object element, int columnIndex) { return ((IUserAgent) element).getName(); } } }