/*******************************************************************************
* Copyright (c) 2000, 2005 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 com.aptana.ide.editors.preferences;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.core.runtime.Plugin;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.internal.IWorkbenchHelpContextIds;
import com.aptana.ide.core.StringUtils;
import com.aptana.ide.core.ui.dialogs.IAddItemListener;
import com.aptana.ide.core.ui.dialogs.TableEditor;
import com.aptana.ide.editors.UnifiedEditorsPlugin;
import com.aptana.ide.editors.unified.errors.ErrorDescriptor;
import com.aptana.ide.editors.validator.ValidatorManager;
import com.aptana.ide.editors.validator.ValidatorRef;
/**
* The file editors page presents the collection of file names and extensions for which the user has registered editors.
* It also lets the user add new internal or external (program) editors for a given file name and extension. The user
* can add an editor for either a specific file name and extension (e.g. report.doc), or for all file names of a given
* extension (e.g. *.doc) The set of registered editors is tracked by the EditorRegistery available from the workbench
* plugin.
*/
public abstract class ProblemsPreferencePage extends PreferencePage implements IWorkbenchPreferencePage,
IAddItemListener
{
private static Image fWarningImage = UnifiedEditorsPlugin.getImageDescriptor("icons/warning.png").createImage(); //$NON-NLS-1$
/**
* workbench
*/
protected IWorkbench workbench;
private TableEditor _tableEditor;
private CheckboxTableViewer _validatorViewer;
/**
* Creates the page's UI content.
*
* @param parent
* @return Control
*/
protected Control createContents(Composite parent)
{
// define common container to Problems Filter and list of available validators
Composite composite = new Composite(parent, SWT.NULL);
GridLayout layout = new GridLayout(1, true);
layout.marginHeight = 0;
layout.marginWidth = 0;
composite.setLayout(layout);
composite.setLayoutData(new GridData(GridData.FILL_BOTH));
createValidatorPreferenceControls(composite);
// create controls for filtering errors
// define container & its gridding
Group errorFilter = new Group(composite, SWT.NONE);
GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 1;
errorFilter.setLayout(gridLayout);
errorFilter.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));
errorFilter.setText(CodeAssistMessages.ProblemsPreferencePage_ProblemViewFilters);
_tableEditor = new TableEditor(errorFilter, SWT.NULL, true);
_tableEditor.setDescription(CodeAssistMessages.ProblemsPreferencePage_ProblemsDescription);
GridData data = new GridData(GridData.FILL_BOTH);
data.heightHint = 150;
_tableEditor.setLayoutData(data);
IPreferenceStore store = doGetPreferenceStore();
String editors = store.getString(doGetPreferenceString());
ErrorDescriptor[] descriptors = ErrorDescriptor.deserializeErrorDescriptors(editors);
List<Object> items = new ArrayList<Object>(Arrays.asList(descriptors));
_tableEditor.setLabelProvider(new TableLabelProvider());
_tableEditor.addAddItemListener(this);
new TableColumn(_tableEditor.getTable(), SWT.LEFT);
_tableEditor.setItems(items);
workbench.getHelpSystem().setHelp(parent, IWorkbenchHelpContextIds.FILE_EDITORS_PREFERENCE_PAGE);
applyDialogFont(_tableEditor);
return composite;
}
private void createValidatorPreferenceControls(Composite parent)
{
// create controls for validators
Composite displayArea = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.numColumns = 1;
layout.makeColumnsEqualWidth = false;
layout.marginHeight = 0;
layout.marginWidth = 0;
layout.verticalSpacing = 10;
layout.horizontalSpacing = 0;
displayArea.setLayout(layout);
GridData data = new GridData(GridData.FILL, GridData.FILL, true, true);
displayArea.setLayoutData(data);
Group validators = new Group(displayArea, SWT.NONE);
GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 1;
validators.setLayout(gridLayout);
validators.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));
validators.setText(CodeAssistMessages.ProblemsPreferencePage_Validators);
Table table = new Table(validators, SWT.CHECK | SWT.BORDER);
table.setFont(parent.getFont());
table.setLayoutData(new GridData(GridData.FILL_BOTH));
_validatorViewer = new CheckboxTableViewer(table);
_validatorViewer.setContentProvider(new ArrayContentProvider());
_validatorViewer.setLabelProvider(new LabelProvider());
data = new GridData(GridData.FILL, GridData.FILL, true, true);
data.heightHint = 100;
data.widthHint = 140;
table.setLayoutData(data);
addvalidators();
String stored_validators = this.getPreferenceStore().getString(IPreferenceConstants.VALIDATORS_LIST);
restoreCheckedValidators(stored_validators);
}
private void restoreCheckedValidators(String stored_validators)
{
// CHECKSTYLE:OFF
if (stored_validators.equals(IPreferenceConstants.VALIDATORS_NONE))
{
// Do nothing : user de-selected all the validators
}
// CHECKSTYLE:ON
else if (stored_validators.length() == 0)
{
// Default-default value : select everything
List<String> validatorNames = (List<String>) _validatorViewer.getInput();
_validatorViewer.setCheckedElements(validatorNames.toArray(new String[validatorNames.size()]));
}
else
{
String[] validators = stored_validators.split(","); //$NON-NLS-1$
List<String> validatorNames = (List<String>) _validatorViewer.getInput();
String name;
int size = validatorNames.size();
int j;
for (int i = 0; i < size; ++i)
{
name = validatorNames.get(i);
for (j = 0; j < validators.length; ++j)
{
if (name.equals(validators[j]))
{
// the name is in the list of checked validators
_validatorViewer.setChecked(name, true);
break;
}
}
if (j == validators.length)
{
// the name is not in the list of checked validators
_validatorViewer.setChecked(name, false);
}
}
}
}
private void addvalidators()
{
String mimeType = getMimeType();
ValidatorManager validatiorManager = ValidatorManager.getInstance();
ValidatorRef[] validators = validatiorManager.getValidators(mimeType);
if (validators != null && validators.length > 0)
{
List<String> validatorNames = new ArrayList<String>();
for (int i = 0; i < validators.length; i++)
{
validatorNames.add(validators[i].getName());
}
_validatorViewer.setInput(validatorNames);
}
}
/**
* getMimeType
*
* @return mime type
*/
protected abstract String getMimeType();
/**
* The preference page is going to be disposed. So deallocate all allocated SWT resources that aren't disposed
* automatically by disposing the page (i.e fonts, cursors, etc). Subclasses should re-implement this method to
* release their own allocated SWT resources.
*/
public void dispose()
{
_tableEditor.removeAddItemListener(this);
super.dispose();
}
/**
* Hook method to get a page specific preference store. Reimplement this method if a page don't want to use its
* parent's preference store.
*
* @return IPreferenceStore
*/
protected abstract IPreferenceStore doGetPreferenceStore();
/**
* Hook method to get a page specific preference store. Reimplement this method if a page don't want to use its
* parent's preference store.
*
* @return Plugin
*/
protected abstract Plugin doGetPlugin();
/**
* Hook method to get a page specific preference store. Reimplement this method if a page don't want to use its
* parent's preference store.
*
* @return String
*/
protected String doGetPreferenceString()
{
return IPreferenceConstants.IGNORE_PROBLEMS;
}
/**
* @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
*/
public void init(IWorkbench aWorkbench)
{
this.workbench = aWorkbench;
// noDefaultAndApplyButton();
}
/**
* Performs special processing when this page's Defaults button has been pressed.
* <p>
* This is a framework hook method for subclasses to do special things when the Defaults button has been pressed.
* Subclasses may override, but should call <code>super.performDefaults</code>.
* </p>
*/
protected void performDefaults()
{
super.performDefaults();
IPreferenceStore store = doGetPreferenceStore();
String editors = store.getDefaultString(doGetPreferenceString());
ErrorDescriptor[] descriptors = ErrorDescriptor.deserializeErrorDescriptors(editors);
List<Object> items = new ArrayList<Object>(Arrays.asList(descriptors));
_tableEditor.setItems(items);
String stored_validators = this.getPreferenceStore().getDefaultString(IPreferenceConstants.VALIDATORS_LIST);
restoreCheckedValidators(stored_validators);
}
/**
* Prompt for resource type.
*
* @return Object
*/
public Object addItem()
{
ErrorDescriptorInfoDialog dialog = new ErrorDescriptorInfoDialog(getControl().getShell());
if (dialog.open() == Window.OK)
{
String message = dialog.getMessage();
ErrorDescriptor ed = new ErrorDescriptor();
ed.setMessage(message);
return ed;
}
return null;
}
/**
* This is a hook for subclasses to do special things when the ok button is pressed. For example, re-implement this
* method if you want to save the page's data into the preference bundle.
*
* @return boolean
*/
public boolean performOk()
{
IPreferenceStore store = doGetPreferenceStore();
List<Object> items = _tableEditor.getItems();
store.setValue(doGetPreferenceString(), ErrorDescriptor.serializeErrorDescriptors((ErrorDescriptor[]) items
.toArray(new ErrorDescriptor[0])));
List<String> validatorItems = new ArrayList<String>();
Object[] checkedItems = _validatorViewer.getCheckedElements();
if (checkedItems.length > 0)
{
for (int i = 0; i < checkedItems.length; i++)
{
validatorItems.add(checkedItems[i].toString());
}
store.setValue(IPreferenceConstants.VALIDATORS_LIST, StringUtils.join(
",", validatorItems.toArray(new String[0]))); //$NON-NLS-1$
}
else
{
// Store special value to indicate the fact that user unselected all the validators.
// This help us distinguish no-selection state from initial state wherein nothing is stored as preference
// initially.
store.setValue(IPreferenceConstants.VALIDATORS_LIST, IPreferenceConstants.VALIDATORS_NONE);
}
doGetPlugin().savePluginPreferences();
return true;
}
/**
* editItem
*
* @param item
* @return Object
*/
public Object editItem(Object item)
{
if (item instanceof ErrorDescriptor)
{
ErrorDescriptorInfoDialog dialog = new ErrorDescriptorInfoDialog(getControl().getShell());
ErrorDescriptor ed = (ErrorDescriptor) item;
dialog.setItem(ed);
if (dialog.open() == Window.OK)
{
ed.setMessage(dialog.getMessage());
return ed;
}
return null;
}
else
{
return null;
}
}
/**
* TableLabelProvider
*
* @author Ingo Muschenetz
*/
public class TableLabelProvider implements ITableLabelProvider
{
/**
* @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
*/
public Image getColumnImage(Object element, int columnIndex)
{
Image image = null;
switch (columnIndex)
{
case 0:
image = fWarningImage;
break;
default:
break;
}
return image;
}
/**
* @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
*/
public String getColumnText(Object element, int columnIndex)
{
String name = StringUtils.EMPTY;
ErrorDescriptor ed = (ErrorDescriptor) element;
switch (columnIndex)
{
case 0:
name = ed.getMessage();
break;
case 1:
name = ed.getFolderPath();
break;
case 2:
name = ed.getFileName();
break;
default:
break;
}
return name;
}
/**
* @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
*/
public void addListener(ILabelProviderListener listener)
{
}
/**
* @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
*/
public void dispose()
{
}
/**
* @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
*/
public boolean isLabelProperty(Object element, String property)
{
return false;
}
/**
* @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
*/
public void removeListener(ILabelProviderListener listener)
{
}
}
}