### Eclipse Workspace Patch 1.0 #P org.eclipse.ui.ide Index: plugin.xml =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.ui.ide/plugin.xml,v retrieving revision 1.309 diff -u -r1.309 plugin.xml --- plugin.xml 26 Oct 2010 14:33:00 -0000 1.309 +++ plugin.xml 19 Nov 2010 14:37:53 -0000 @@ -1850,16 +1850,6 @@ mnemonic="%command.configureColumns.mnemonic" style="push"> - - - - @@ -1913,16 +1903,6 @@ mnemonic="%command.configureColumns.mnemonic" style="push"> - - - - @@ -1986,16 +1966,6 @@ mnemonic="%command.configureColumns.mnemonic" style="push"> - - - - @@ -2049,16 +2019,6 @@ mnemonic="%command.configureColumns.mnemonic" style="push"> - - - - - - - - - - - - Index: src/org/eclipse/ui/internal/views/markers/ConfigureColumnsHandler.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/ConfigureColumnsHandler.java,v retrieving revision 1.3 diff -u -r1.3 ConfigureColumnsHandler.java --- src/org/eclipse/ui/internal/views/markers/ConfigureColumnsHandler.java 25 May 2009 20:52:03 -0000 1.3 +++ src/org/eclipse/ui/internal/views/markers/ConfigureColumnsHandler.java 19 Nov 2010 14:37:53 -0000 @@ -12,7 +12,6 @@ import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.IHandler; -import org.eclipse.jface.util.ConfigureColumns; import org.eclipse.ui.views.markers.MarkerViewHandler; /** @@ -33,7 +32,7 @@ ExtendedMarkersView view = getView(event); if (view == null) return this; - ConfigureColumns.forTree(view.getViewer().getTree(), view.getSite()); + new MarkersViewSettingDialog(view).open(); return this; } Index: src/org/eclipse/ui/internal/views/markers/ExtendedMarkersView.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/ExtendedMarkersView.java,v retrieving revision 1.50 diff -u -r1.50 ExtendedMarkersView.java --- src/org/eclipse/ui/internal/views/markers/ExtendedMarkersView.java 15 Oct 2010 10:34:52 -0000 1.50 +++ src/org/eclipse/ui/internal/views/markers/ExtendedMarkersView.java 19 Nov 2010 14:37:57 -0000 @@ -117,11 +117,11 @@ */ public final Object MARKERSVIEW_UPDATE_JOB_FAMILY = new Object(); + static final String MARKER_FIELD = "MARKER_FIELD"; //$NON-NLS-1$ + private static int instanceCount = 1; private static final String TAG_GENERATOR = "markerContentGenerator"; //$NON-NLS-1$ - private static final String MARKER_FIELD = "MARKER_FIELD"; //$NON-NLS-1$ - private static final String TAG_EXPANDED = "expanded"; //$NON-NLS-1$ private static final String TAG_CATEGORY = "category"; //$NON-NLS-1$ @@ -240,7 +240,7 @@ /*| SWT.VIRTUAL */| SWT.V_SCROLL | SWT.MULTI | SWT.FULL_SELECTION)); viewer.getTree().setLinesVisible(true); viewer.setUseHashlookup(true); - createColumns(new TreeColumn[0]); + createColumns(new TreeColumn[0], new int[0]); viewer.setContentProvider(getContentProvider()); } @@ -249,22 +249,18 @@ * * @param currentColumns * the columns to refresh + * @param widths */ - private void createColumns(TreeColumn[] currentColumns) { + private void createColumns(TreeColumn[] currentColumns, int[] widths) { Tree tree = viewer.getTree(); TableLayout layout = new TableLayout(); MarkerField[] fields = generator.getVisibleFields(); - IMemento columnWidths = null; - if (memento != null) - columnWidths = memento.getChild(TAG_COLUMN_WIDTHS); - for (int i = 0; i < fields.length; i++) { MarkerField markerField = fields[i]; - - TreeViewerColumn column; + TreeViewerColumn column = null; if (i < currentColumns.length) column = new TreeViewerColumn(viewer, currentColumns[i]); else { @@ -289,27 +285,21 @@ if (builder.getPrimarySortField().equals(markerField)) updateDirectionIndicator(column.getColumn(), markerField); - int columnWidth = -1; - - if (i == 0) { - // Compute and store a font metric - GC gc = new GC(tree); - gc.setFont(tree.getFont()); - FontMetrics fontMetrics = gc.getFontMetrics(); - gc.dispose(); - columnWidth = Math.max(markerField.getDefaultColumnWidth(tree), - fontMetrics.getAverageCharWidth() * 5); + IMemento columnWidths = null; + if (memento != null){ + columnWidths = memento.getChild(TAG_COLUMN_WIDTHS); } - - if (columnWidths != null) { - Integer value = columnWidths.getInteger(getFieldId(column - .getColumn())); - - // Make sure we get a useful value - if (value != null && value.intValue() > 0) - columnWidth = value.intValue(); + int columnWidth = -1; + if(i < widths.length){ + columnWidth = widths[i]; + if (columnWidths != null) { + //save it + columnWidths.putInteger(markerField.getConfigurationElement().getAttribute( + MarkerSupportInternalUtilities.ATTRIBUTE_ID), columnWidth); + } + }else{ + columnWidth = getFieldWidth(markerField, columnWidth); } - // Take trim into account if we are using the default value, but not // if it is restored. if (columnWidth < 0) @@ -324,7 +314,6 @@ if (currentColumns.length > fields.length) { for (int i = fields.length; i < currentColumns.length; i++) { currentColumns[i].dispose(); - } } @@ -334,6 +323,39 @@ tree.layout(true); } + + int getFieldWidth(MarkerField markerField, int columnWidth) { + Tree tree = getViewer().getTree(); + + if (columnWidth < 0 && memento != null) { + IMemento columnWidths = memento.getChild(TAG_COLUMN_WIDTHS); + if (columnWidths != null) { + Integer value = columnWidths.getInteger(markerField + .getConfigurationElement().getAttribute( + MarkerSupportInternalUtilities.ATTRIBUTE_ID)); + // Make sure we get a useful value + if (value != null && value.intValue() > 0) + columnWidth = value.intValue(); + } + } + if (columnWidth <= 0) { + // Compute and store a font metric + GC gc = new GC(tree); + gc.setFont(tree.getFont()); + FontMetrics fontMetrics = gc.getFontMetrics(); + gc.dispose(); + columnWidth = Math.max(markerField.getDefaultColumnWidth(tree), + fontMetrics.getAverageCharWidth() * 5); + } + TreeColumn[] columns = tree.getColumns(); + for (int i = 0; i < columns.length; i++) { + if (MARKER_FIELD.equals(columns[i].getData(MARKER_FIELD))) { + columnWidth = Math.max(columnWidth, columns[i].getWidth()); + return columnWidth; + } + } + return columnWidth; + } /* * (non-Javadoc) @@ -1460,11 +1482,11 @@ /** * @param visible */ - void setVisibleFields(Collection visible) { + void setVisibleFields(Collection visible,int[] widths) { generator.setVisibleFields(visible); //viewer.setSelection(new StructuredSelection()); //viewer.removeAndClearAll(); - createColumns(viewer.getTree().getColumns()); + createColumns(viewer.getTree().getColumns(), widths); scheduleUpdate(0L); } Index: src/org/eclipse/ui/internal/views/markers/MarkerPreferencesDialog.java =================================================================== RCS file: src/org/eclipse/ui/internal/views/markers/MarkerPreferencesDialog.java diff -N src/org/eclipse/ui/internal/views/markers/MarkerPreferencesDialog.java --- src/org/eclipse/ui/internal/views/markers/MarkerPreferencesDialog.java 8 Sep 2009 18:00:36 -0000 1.8 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,483 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2009 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.views.markers; - -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.jface.preference.IntegerFieldEditor; -import org.eclipse.jface.resource.JFaceColors; -import org.eclipse.jface.viewers.IStructuredContentProvider; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.LabelProvider; -import org.eclipse.jface.viewers.ListViewer; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.layout.FormAttachment; -import org.eclipse.swt.layout.FormData; -import org.eclipse.swt.layout.FormLayout; -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.Group; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.ui.internal.ide.IDEInternalPreferences; -import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin; -import org.eclipse.ui.preferences.ViewSettingsDialog; -import org.eclipse.ui.views.markers.MarkerField; -import org.eclipse.ui.views.markers.internal.MarkerMessages; - -/** - * MarkerPreferencesDialog is the dialog for showing marker preferences. - * - * @since 3.4 - * - */ -public class MarkerPreferencesDialog extends ViewSettingsDialog { - - private IntegerFieldEditor limitEditor; - - private Button enablementButton; - - private Composite editArea; - - private Label messageLabel; - - private ExtendedMarkersView extendedView; - - private ArrayList visible; - - private ArrayList hidden; - - private ListViewer visibleViewer; - - private ListViewer nonVisibleViewer; - - /** - * Create a new instance of the receiver. - * - * @param view - - * the view this is being launched from - */ - public MarkerPreferencesDialog(ExtendedMarkersView view) { - super(view.getSite().getShell()); - this.extendedView = view; - - Object[] visibleFields = view.getVisibleFields(); - Object[] hiddenFields = view.getHiddenFields(); - - visible = new ArrayList(); - hidden = new ArrayList(); - - for (int i = 0; i < visibleFields.length; i++) { - visible.add(visibleFields[i]); - } - - for (int i = 0; i < hiddenFields.length; i++) { - hidden.add(hiddenFields[i]); - } - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell) - */ - protected void configureShell(Shell newShell) { - super.configureShell(newShell); - newShell.setText(MarkerMessages.MarkerPreferences_DialogTitle); - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.jface.window.Window#getShellStyle() - */ - protected int getShellStyle() { - return super.getShellStyle() | SWT.RESIZE; - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite) - */ - protected Control createDialogArea(Composite parent) { - - Composite dialogArea = (Composite) super.createDialogArea(parent); - - boolean checked = IDEWorkbenchPlugin.getDefault().getPreferenceStore() - .getBoolean(IDEInternalPreferences.USE_MARKER_LIMITS); - enablementButton = new Button(dialogArea, SWT.CHECK); - enablementButton.setText(MarkerMessages.MarkerPreferences_MarkerLimits); - enablementButton.setSelection(checked); - - editArea = new Composite(dialogArea, SWT.NONE); - editArea.setLayout(new GridLayout()); - GridData editData = new GridData(GridData.FILL_BOTH - | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL); - editData.horizontalIndent = 10; - editArea.setLayoutData(editData); - - limitEditor = new IntegerFieldEditor( - "limit", MarkerMessages.MarkerPreferences_VisibleItems, editArea) { //$NON-NLS-1$ - /* - * (non-Javadoc) - * - * @see org.eclipse.jface.preference.IntegerFieldEditor#checkState() - */ - protected boolean checkState() { - boolean state = super.checkState(); - setValid(state, getErrorMessage()); - return state; - } - }; - limitEditor.setPreferenceStore(IDEWorkbenchPlugin.getDefault() - .getPreferenceStore()); - limitEditor - .setPreferenceName(IDEInternalPreferences.MARKER_LIMITS_VALUE); - limitEditor.load(); - - GridData checkedData = new GridData(SWT.FILL, SWT.NONE, true, false); - checkedData.horizontalSpan = limitEditor.getNumberOfControls(); - enablementButton.setLayoutData(checkedData); - - enablementButton.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - setLimitEditorEnablement(editArea, enablementButton - .getSelection()); - } - }); - - setLimitEditorEnablement(editArea, checked); - - messageLabel = new Label(dialogArea, SWT.NONE); - - messageLabel.setBackground(JFaceColors.getErrorBackground(dialogArea - .getDisplay())); - messageLabel.setForeground(JFaceColors.getErrorText(dialogArea - .getDisplay())); - messageLabel - .setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false)); - - createColumnsArea(dialogArea); - - applyDialogFont(dialogArea); - return dialogArea; - } - - /** - * Create an area for the selected columns - * - * @param dialogArea - */ - private void createColumnsArea(Composite dialogArea) { - - initializeDialogUnits(dialogArea); - Group columnsComposite = new Group(dialogArea, SWT.NONE); - columnsComposite.setText(MarkerMessages.MarkerPreferences_ColumnGroupTitle); - FormLayout layout = new FormLayout(); - columnsComposite.setLayout(layout); - - columnsComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, - true)); - Label visibleItemsLabel = new Label(columnsComposite, SWT.NONE); - visibleItemsLabel.setText(MarkerMessages.MarkerPreferences_VisibleColumnsTitle); - FormData visibleLabelData = new FormData(); - visibleLabelData.right = new FormAttachment(45, 0); - visibleLabelData.left = new FormAttachment( - IDialogConstants.BUTTON_MARGIN); - visibleLabelData.top = new FormAttachment(0); - visibleItemsLabel.setLayoutData(visibleLabelData); - - int rightMargin = IDialogConstants.BUTTON_MARGIN * -1; - - Label nonVisibleLabel = new Label(columnsComposite, SWT.NONE); - nonVisibleLabel.setText(MarkerMessages.MarkerPreferences_HiddenColumnsTitle); - FormData nonVisibleLabelData = new FormData(); - nonVisibleLabelData.right = new FormAttachment(100); - nonVisibleLabelData.left = new FormAttachment(55, 0); - nonVisibleLabelData.top = new FormAttachment(0); - nonVisibleLabel.setLayoutData(nonVisibleLabelData); - - visibleViewer = new ListViewer(columnsComposite, - SWT.BORDER); - - FormData visibleViewerData = new FormData(); - visibleViewerData.right = new FormAttachment(visibleItemsLabel, 0, - SWT.RIGHT); - visibleViewerData.left = new FormAttachment(visibleItemsLabel, 0, - SWT.LEFT); - visibleViewerData.top = new FormAttachment(visibleItemsLabel, - IDialogConstants.BUTTON_MARGIN); - visibleViewerData.bottom = new FormAttachment(100, rightMargin); - visibleViewerData.height = convertHeightInCharsToPixels(15); - visibleViewerData.width = convertWidthInCharsToPixels(25); - - visibleViewer.getControl().setLayoutData(visibleViewerData); - - visibleViewer.setContentProvider(new IStructuredContentProvider() { - - /* - * (non-Javadoc) - * - * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) - */ - public Object[] getElements(Object inputElement) { - return visible.toArray(); - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.jface.viewers.IContentProvider#dispose() - */ - public void dispose() { - } - - /* - * (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) { - } - - }); - - visibleViewer.setLabelProvider(markerFieldLabelProvider()); - - visibleViewer.setInput(this); - - nonVisibleViewer = new ListViewer(columnsComposite, - SWT.BORDER); - - nonVisibleViewer.setLabelProvider(markerFieldLabelProvider()); - - nonVisibleViewer.setContentProvider(new IStructuredContentProvider() { - - /* - * (non-Javadoc) - * - * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) - */ - public Object[] getElements(Object inputElement) { - return hidden.toArray(); - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.jface.viewers.IContentProvider#dispose() - */ - public void dispose() { - } - - /* - * (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) { - } - - }); - nonVisibleViewer.setInput(this); - - FormData nonVisibleViewerData = new FormData(); - nonVisibleViewerData.right = new FormAttachment(nonVisibleLabel, 0, - SWT.RIGHT); - nonVisibleViewerData.left = new FormAttachment(nonVisibleLabel, 0, - SWT.LEFT); - nonVisibleViewerData.top = new FormAttachment(nonVisibleLabel, - IDialogConstants.BUTTON_MARGIN); - nonVisibleViewerData.bottom = new FormAttachment(100, rightMargin); - nonVisibleViewerData.height = convertHeightInCharsToPixels(15); - nonVisibleViewerData.width = convertWidthInCharsToPixels(25); - - nonVisibleViewer.getControl().setLayoutData(nonVisibleViewerData); - - Button toNonVisibleButton = new Button(columnsComposite, SWT.PUSH); - toNonVisibleButton - .setText(getDefaultOrientation() == SWT.RIGHT_TO_LEFT ? MarkerMessages.MarkerPreferences_MoveLeft - : MarkerMessages.MarkerPreferences_MoveRight); - - FormData toNonVisibleButtonData = new FormData(); - - toNonVisibleButtonData.top = new FormAttachment(visibleViewer - .getControl(), IDialogConstants.BUTTON_BAR_HEIGHT, SWT.TOP); - toNonVisibleButtonData.left = new FormAttachment(visibleViewer - .getControl(), IDialogConstants.BUTTON_MARGIN); - toNonVisibleButtonData.right = new FormAttachment(nonVisibleViewer - .getControl(), rightMargin); - toNonVisibleButton.setLayoutData(toNonVisibleButtonData); - - toNonVisibleButton.addSelectionListener(new SelectionAdapter() { - /* - * (non-Javadoc) - * - * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent) - */ - public void widgetSelected(SelectionEvent e) { - List selection = ((IStructuredSelection) visibleViewer - .getSelection()).toList(); - hidden.addAll(selection); - visible.removeAll(selection); - visibleViewer.refresh(); - nonVisibleViewer.refresh(); - setValid( - visible.size() > 0, - MarkerMessages.MarkerPreferences_AtLeastOneVisibleColumn); - } - }); - - Button toVisibleButton = new Button(columnsComposite, SWT.PUSH); - toVisibleButton - .setText(getDefaultOrientation() == SWT.RIGHT_TO_LEFT ? MarkerMessages.MarkerPreferences_MoveRight - : MarkerMessages.MarkerPreferences_MoveLeft); - - FormData toVisibleButtonData = new FormData(); - - toVisibleButtonData.top = new FormAttachment(toNonVisibleButton, - IDialogConstants.BUTTON_MARGIN); - toVisibleButtonData.left = new FormAttachment(visibleViewer - .getControl(), IDialogConstants.BUTTON_MARGIN); - toVisibleButtonData.right = new FormAttachment(nonVisibleViewer - .getControl(), rightMargin); - toVisibleButton.setLayoutData(toVisibleButtonData); - - toVisibleButton.addSelectionListener(new SelectionAdapter() { - /* - * (non-Javadoc) - * - * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent) - */ - public void widgetSelected(SelectionEvent e) { - List selection = ((IStructuredSelection) nonVisibleViewer - .getSelection()).toList(); - hidden.removeAll(selection); - visible.addAll(selection); - visibleViewer.refresh(); - nonVisibleViewer.refresh(); - setValid( - visible.size() > 0, - MarkerMessages.MarkerPreferences_AtLeastOneVisibleColumn); - } - }); - - } - - /** - * Return a label provider for fields. - * @return LabelProvider - */ - private LabelProvider markerFieldLabelProvider() { - return new LabelProvider() { - /* - * (non-Javadoc) - * - * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object) - */ - public String getText(Object element) { - return ((MarkerField) element).getName(); - } - }; - } - - /** - * Set the enabled state of the OK button by state. - * - * @param state - */ - protected void setValid(boolean state, String errorMessage) { - Button okButton = getButton(IDialogConstants.OK_ID); - - if (okButton == null) - return; - - if (state) - messageLabel.setText(MarkerSupportInternalUtilities.EMPTY_STRING); - else - messageLabel.setText(errorMessage); - - okButton.setEnabled(state); - - } - - /** - * Enable the limitEditor based on checked. - * - * @param control - * The parent of the editor - * @param checked - */ - private void setLimitEditorEnablement(Composite control, boolean checked) { - limitEditor.setEnabled(checked, control); - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.jface.dialogs.Dialog#okPressed() - */ - protected void okPressed() { - - limitEditor.store(); - IDEWorkbenchPlugin.getDefault().getPreferenceStore().setValue( - IDEInternalPreferences.USE_MARKER_LIMITS, - enablementButton.getSelection()); - IDEWorkbenchPlugin.getDefault().savePluginPreferences(); - - extendedView.setVisibleFields(visible); - - super.okPressed(); - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.ui.preferences.ViewSettingsDialog#performDefaults() - */ - protected void performDefaults() { - super.performDefaults(); - limitEditor.loadDefault(); - boolean checked = IDEWorkbenchPlugin.getDefault().getPreferenceStore() - .getDefaultBoolean(IDEInternalPreferences.USE_MARKER_LIMITS); - enablementButton.setSelection(checked); - setLimitEditorEnablement(editArea, checked); - - Object[] visibleFields=extendedView.getBuilder().getGenerator().getInitialVisible(); - Object[] allFields=extendedView.getBuilder().getGenerator().getAllFields(); - visible.clear(); - hidden.clear(); - for (int i = 0; i < allFields.length; i++) { - hidden.add(allFields[i]); - } - for (int i = 0; i < visibleFields.length; i++) { - hidden.remove(visibleFields[i]); - visible.add(visibleFields[i]); - } - visibleViewer.refresh(); - nonVisibleViewer.refresh(); - } - -} Index: src/org/eclipse/ui/internal/views/markers/MarkerPreferencesHandler.java =================================================================== RCS file: src/org/eclipse/ui/internal/views/markers/MarkerPreferencesHandler.java diff -N src/org/eclipse/ui/internal/views/markers/MarkerPreferencesHandler.java --- src/org/eclipse/ui/internal/views/markers/MarkerPreferencesHandler.java 25 Apr 2008 12:53:22 -0000 1.3 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,38 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2005, 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.views.markers; - -import org.eclipse.core.commands.ExecutionEvent; -import org.eclipse.core.commands.IHandler; -import org.eclipse.ui.views.markers.MarkerViewHandler; - -/** - * MarkerPreferencesHandler is the handler for opening the marker preferences dialog. - * @since 3.4 - * - */ -public class MarkerPreferencesHandler extends MarkerViewHandler implements - IHandler { - - /* (non-Javadoc) - * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent) - */ - public Object execute(ExecutionEvent event) { - - ExtendedMarkersView view = getView(event); - if(view == null) - return this; - - new MarkerPreferencesDialog(view).open(); - return this; - } - -} Index: src/org/eclipse/ui/internal/views/markers/MarkerSupportInternalUtilities.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/MarkerSupportInternalUtilities.java,v retrieving revision 1.11 diff -u -r1.11 MarkerSupportInternalUtilities.java --- src/org/eclipse/ui/internal/views/markers/MarkerSupportInternalUtilities.java 22 Jul 2010 10:34:52 -0000 1.11 +++ src/org/eclipse/ui/internal/views/markers/MarkerSupportInternalUtilities.java 19 Nov 2010 14:37:57 -0000 @@ -317,15 +317,12 @@ */ static int getMarkerLimit() { - // If limits are enabled return it. Otherwise return -1 - if (IDEWorkbenchPlugin.getDefault().getPreferenceStore().getBoolean( - IDEInternalPreferences.USE_MARKER_LIMITS)) { - return IDEWorkbenchPlugin.getDefault().getPreferenceStore().getInt( - IDEInternalPreferences.MARKER_LIMITS_VALUE); - + int value = IDEWorkbenchPlugin.getDefault().getPreferenceStore() + .getInt(IDEInternalPreferences.MARKER_LIMITS_VALUE); + if (value <= 0) { + return -1; } - return -1; - + return value; } /** Index: src/org/eclipse/ui/internal/views/markers/Markers.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.ui.ide/src/org/eclipse/ui/internal/views/markers/Markers.java,v retrieving revision 1.5 diff -u -r1.5 Markers.java --- src/org/eclipse/ui/internal/views/markers/Markers.java 30 Nov 2009 19:32:35 -0000 1.5 +++ src/org/eclipse/ui/internal/views/markers/Markers.java 19 Nov 2010 14:37:57 -0000 @@ -29,8 +29,9 @@ import org.eclipse.ui.views.markers.internal.MarkerMessages; /** - * The Markers object contains the MarkerEntry(s) collected and updated by the system, - * also maintains the categories that markers are grouped into. + * The Markers object contains the MarkerEntry(s) collected and updated by the + * system, also maintains the categories that markers are grouped into. + * * @since 3.6 * */ @@ -39,41 +40,39 @@ static final MarkerCategory[] EMPTY_CATEGORY_ARRAY = new MarkerCategory[0]; static final MarkerEntry[] EMPTY_ENTRY_ARRAY = new MarkerEntry[0]; - //the marker entries + // the marker entries private MarkerEntry[] markerEntryArray = EMPTY_ENTRY_ARRAY; - //the categories + // the categories private MarkerCategory[] categories = EMPTY_CATEGORY_ARRAY; - private CachedMarkerBuilder builder; - - private boolean inChange=false; + + private boolean inChange = false; // markerToEntryMap is a lazily created map from the markers to thier // corresponding entry private Map markerToEntryMap = null; private Integer[] markerCounts; - Markers(CachedMarkerBuilder builder) { this.builder = builder; - inChange=false; + inChange = false; } /** * Update with newly collected markers * * @param markerEntries - * the new marker entries + * the new marker entries * @param sortAndGroup - * true sort and group them + * true sort and group them * @param monitor */ synchronized boolean updateWithNewMarkers(Collection markerEntries, boolean sortAndGroup, IProgressMonitor monitor) { - boolean initialVal=inChange; + boolean initialVal = inChange; try { - inChange=true; + inChange = true; if (markerToEntryMap != null) { markerToEntryMap.clear(); markerToEntryMap = null; @@ -103,7 +102,7 @@ } return true; } finally { - inChange=initialVal; + inChange = initialVal; } } @@ -113,9 +112,9 @@ * @param monitor */ synchronized boolean sortAndMakeCategories(IProgressMonitor monitor) { - boolean initialVal=inChange; + boolean initialVal = inChange; try { - inChange=true; + inChange = true; // Sort by Category first if (builder.isShowingHierarchy()) { MarkerCategory[] markerCategories = groupIntoCategories( @@ -132,7 +131,7 @@ return sortMarkerEntries(monitor); } finally { - inChange=initialVal; + inChange = initialVal; } } @@ -143,9 +142,9 @@ if (monitor.isCanceled()) { return false; } - boolean initialVal=inChange; + boolean initialVal = inChange; try { - inChange=true; + inChange = true; if (builder.isShowingHierarchy()) { Comparator comparator = builder.getComparator() .getFieldsComparator(); @@ -168,8 +167,8 @@ } int avaialble = markerEntryArray.length - 1; int effLimit = getShowingLimit(avaialble); - MarkerSortUtil.sortStartingKElement(markerEntryArray, builder - .getComparator(), effLimit, monitor); + MarkerSortUtil.sortStartingKElement(markerEntryArray, + builder.getComparator(), effLimit, monitor); } if (monitor.isCanceled()) { return false; @@ -177,18 +176,19 @@ monitor.worked(50); return true; } finally { - inChange=initialVal; + inChange = initialVal; } } /** * get marker limit to show, if any. + * * @param avaliable */ private int getShowingLimit(int avaliable) { int limit = MarkerSupportInternalUtilities.getMarkerLimit(); int effLimit = limit; - if (avaliable < effLimit || limit == -1) { + if (avaliable < effLimit || limit <= 0) { effLimit = avaliable; } return effLimit; @@ -203,8 +203,8 @@ */ MarkerCategory[] groupIntoCategories(IProgressMonitor monitor, MarkerEntry[] newMarkers) { - Map boundaryInfoMap = groupMarkerEntries(newMarkers, builder - .getCategoryGroup(), newMarkers.length - 1, monitor); + Map boundaryInfoMap = groupMarkerEntries(newMarkers, + builder.getCategoryGroup(), newMarkers.length - 1, monitor); Iterator iterator = boundaryInfoMap.keySet().iterator(); int start = 0; MarkerCategory[] markerCategories = new MarkerCategory[boundaryInfoMap @@ -215,8 +215,8 @@ Object key = iterator.next(); end = ((Integer) boundaryInfoMap.get(key)).intValue(); markerCategories[i++] = new MarkerCategory(this, start, end, - builder.getCategoryGroup().getMarkerField().getValue( - newMarkers[start])); + builder.getCategoryGroup().getMarkerField() + .getValue(newMarkers[start])); start = end + 1; } return markerCategories; @@ -234,21 +234,21 @@ * @return {@link Map} * */ - private Map groupMarkerEntries(MarkerEntry[] entries, MarkerGroup group, int k, - IProgressMonitor monitor) { + private Map groupMarkerEntries(MarkerEntry[] entries, MarkerGroup group, + int k, IProgressMonitor monitor) { TreeMap map = new TreeMap(group.getEntriesComparator()); for (int i = 0; i <= k; i++) { IMarker marker = entries[i].getMarker(); if (marker == null) { continue;// skip stale markers } - if(monitor.isCanceled()){ + if (monitor.isCanceled()) { map.clear(); return map; } try { - MarkerGroupingEntry groupingEntry = group.findGroupValue(marker - .getType(), marker); + MarkerGroupingEntry groupingEntry = group.findGroupValue( + marker.getType(), marker); List list = (List) map.get(groupingEntry); if (list == null) { list = new ArrayList(); @@ -262,7 +262,7 @@ Iterator keys = map.keySet().iterator(); int i = 0; while (keys.hasNext()) { - if(monitor.isCanceled()){ + if (monitor.isCanceled()) { map.clear(); return map; } @@ -287,16 +287,16 @@ */ Integer[] getMarkerCounts() { if (markerCounts == null) { - markerCounts=getMarkerCounts(markerEntryArray); + markerCounts = getMarkerCounts(markerEntryArray); } return markerCounts; } /** - * Returns an array of marker counts for the given MarkerEntry array - * , where getMarkerCounts()[severity] is the number of markers in - * the list with the given severity. + * Returns an array of marker counts for the given MarkerEntry array , where + * getMarkerCounts()[severity] is the number of markers in the list with the + * given severity. * * @return an array of {@link Integer} where index indicates * [errors,warnings,infos,others] @@ -366,7 +366,7 @@ * @return MarkerSupportItem[] */ public MarkerSupportItem[] getElements() { - if(builder.isShowingHierarchy()){ + if (builder.isShowingHierarchy()) { return categories; } return markerEntryArray; @@ -378,10 +378,9 @@ CachedMarkerBuilder getBuilder() { return builder; } - + /** - * Use clone where thread safety is concerned. - * The method is non-blocking. + * Use clone where thread safety is concerned. The method is non-blocking. */ Markers getClone() { Markers markers = new Markers(builder); @@ -399,7 +398,9 @@ return inChange; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see java.lang.Object#hashCode() */ public int hashCode() { @@ -409,7 +410,9 @@ return result; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see java.lang.Object#equals(java.lang.Object) */ public boolean equals(Object obj) { Index: src/org/eclipse/ui/internal/views/markers/MarkersViewSettingDialog.java =================================================================== RCS file: src/org/eclipse/ui/internal/views/markers/MarkersViewSettingDialog.java diff -N src/org/eclipse/ui/internal/views/markers/MarkersViewSettingDialog.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/ui/internal/views/markers/MarkersViewSettingDialog.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,318 @@ +/******************************************************************************* + * Copyright (c) 2008, 2009 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.views.markers; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +import org.eclipse.jface.viewers.ITableLabelProvider; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.internal.ide.IDEInternalPreferences; +import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin; +import org.eclipse.ui.views.markers.MarkerField; +import org.eclipse.ui.views.markers.internal.MarkerMessages; + +/** + * MarkersViewSettingDialog is the dialog for showing marker preferences. + * + * + * @since 3.7 + * @author Hitesh Soliwal + * + */ +public class MarkersViewSettingDialog extends ViewerColumnsDialog { + + private ExtendedMarkersView extendedView; + + /** + * Create a new instance of the receiver. + * + * @param view + * - the view this is being launched from + */ + public MarkersViewSettingDialog(ExtendedMarkersView view) { + super(view.getSite().getShell()); + this.extendedView = view; + initialize(convert(extendedView.getBuilder().getGenerator() + .getVisibleFields()), convert(extendedView.getBuilder() + .getGenerator().getAllFields()), false); + setLimitValue(IDEWorkbenchPlugin.getDefault().getPreferenceStore() + .getInt(IDEInternalPreferences.MARKER_LIMITS_VALUE)); + } + + /* + * (non-Javadoc) + * + * @see + * org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets + * .Shell) + */ + protected void configureShell(Shell newShell) { + super.configureShell(newShell); + newShell.setText(MarkerMessages.MarkerPreferences_DialogTitle); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.window.Window#getShellStyle() + */ + protected int getShellStyle() { + return super.getShellStyle() | SWT.RESIZE; + } + + /* + * (non-Javadoc) + * + * @see + * org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets + * .Composite) + */ + protected Control createDialogArea(Composite parent) { + Control control = super.createDialogArea(parent); + return control; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.dialogs.Dialog#okPressed() + */ + protected void okPressed() { + IDEWorkbenchPlugin + .getDefault() + .getPreferenceStore() + .setValue(IDEInternalPreferences.MARKER_LIMITS_VALUE, + getLimitValue()); + IDEWorkbenchPlugin.getDefault().savePluginPreferences(); + extendedView.setVisibleFields(getVisibleFields(), getNewWidths()); + super.okPressed(); + } + + /** + */ + private int[] getNewWidths() { + List visible = getVisible(); + int[] widths = new int[visible.size()]; + int i = 0; + Iterator iterator = visible.iterator(); + while (iterator.hasNext()) { + widths[i++] = ((FieldEntry) iterator.next()).width; + } + return widths; + + } + + private Collection getVisibleFields() { + List visible = getVisible(); + List list = new ArrayList(visible.size()); + Iterator iterator = visible.iterator(); + while (iterator.hasNext()) { + list.add(((FieldEntry) iterator.next()).field); + } + return list; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.ui.preferences.ViewSettingsDialog#performDefaults() + */ + protected void performDefaults() { + initialize(convert(extendedView.getBuilder().getGenerator() + .getInitialVisible()), convert(extendedView.getBuilder() + .getGenerator().getAllFields()), true); + setLimitValue(IDEWorkbenchPlugin.getDefault().getPreferenceStore() + .getDefaultInt(IDEInternalPreferences.MARKER_LIMITS_VALUE)); + super.performDefaults(); + } + + /** + * @param visibleFields + * @param allFields + */ + void initialize(FieldEntry[] visibleFields, FieldEntry[] allFields, + boolean defaultWidths) { + List visible = getVisible(); + List nonVisible = getNonVisible(); + visible.clear(); + nonVisible.clear(); + for (int i = 0; i < allFields.length; i++) { + nonVisible.add(allFields[i]); + } + for (int i = 0; i < visibleFields.length; i++) { + nonVisible.remove(visibleFields[i]); + visible.add(visibleFields[i]); + visibleFields[i].visible = true; + if (defaultWidths) { + visibleFields[i].width = extendedView.getFieldWidth( + visibleFields[i].field, 0); + } else { + // from a persistent store + visibleFields[i].width = extendedView.getFieldWidth( + visibleFields[i].field, -1); + } + } + } + + /* + * (non-Javadoc) + * + * @see + * org.eclipse.ui.internal.views.markers.ViewerColumnsDialog#getLabelProvider + * () + */ + protected ITableLabelProvider getLabelProvider() { + return new TableLabelProvider() { + public String getText(Object element) { + return ((FieldEntry) element).field.getName(); + } + }; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.ui.internal.views.markers.ViewerColumnsDialog# + * getColumnInfoProvider() + */ + protected IColumnInfoProvider getColumnInfoProvider() { + + return new IColumnInfoProvider() { + public int getColumnIndex(Object columnObj) { + return getVisible().indexOf(columnObj); + } + + public int getColumnWidth(Object columnObj) { + FieldEntry field = (FieldEntry) columnObj; + return extendedView.getFieldWidth(field.field, field.width); + } + + public boolean isColumnVisible(Object columnObj) { + return ((FieldEntry) columnObj).visible; + } + + public boolean isColumnMovable(Object columnObj) { + return true; + } + + public boolean isColumnResizable(Object columnObj) { + return true; + } + }; + } + + /* + * (non-Javadoc) + * + * @see + * org.eclipse.ui.internal.views.markers.ViewerColumnsDialog#getColumnUpdater + * () + */ + protected IColumnUpdater getColumnUpdater() { + + return new IColumnUpdater() { + public void setColumnVisible(Object columnObj, boolean visible) { + ((FieldEntry) columnObj).visible = visible; + } + + public void setColumnMovable(Object columnObj, boolean movable) { + // not implemented + } + + public void setColumnIndex(Object columnObj, int index) { + // ignore + } + + public void setColumnResizable(Object columnObj, boolean resizable) { + // ignore + } + + public void setColumnWidth(Object columnObj, int newWidth) { + ((FieldEntry) columnObj).width = newWidth; + } + }; + } + + private static FieldEntry[] convert(Object[] fields) { + FieldEntry[] entries = new FieldEntry[fields.length]; + for (int i = 0; i < entries.length; i++) { + entries[i] = new FieldEntry((MarkerField) fields[i], -1); + } + return entries; + } + + static class FieldEntry { + final MarkerField field; + int width; + boolean visible; + + FieldEntry(MarkerField field, int width) { + this.field = field; + this.width = width; + visible = false; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#toString() + */ + public String toString() { + // TODO Auto-generated method stub + return super.toString(); + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#hashCode() + */ + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((field == null) ? 0 : field.hashCode()); + return result; + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#equals(java.lang.Object) + */ + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (!(obj instanceof FieldEntry)) { + return false; + } + FieldEntry other = (FieldEntry) obj; + if (field == null) { + if (other.field != null) { + return false; + } + } else if (!field.equals(other.field)) { + return false; + } + return true; + } + } +} Index: src/org/eclipse/ui/internal/views/markers/ViewerColumnsDialog.java =================================================================== RCS file: src/org/eclipse/ui/internal/views/markers/ViewerColumnsDialog.java diff -N src/org/eclipse/ui/internal/views/markers/ViewerColumnsDialog.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/ui/internal/views/markers/ViewerColumnsDialog.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,1208 @@ +/******************************************************************************* + * Copyright (c) 2010 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.views.markers; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.Random; + +import org.eclipse.core.runtime.IStatus; +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.resource.JFaceResources; +import org.eclipse.jface.viewers.ISelection; +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.TableViewer; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.CLabel; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.layout.FillLayout; +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.swt.widgets.Event; +import org.eclipse.swt.widgets.Group; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.preferences.ViewSettingsDialog; +import org.eclipse.ui.views.markers.internal.MarkerMessages; + +/** + * This was introduced as a fix to Bug , as an effort to combine the columns and + * preference dialogs into one. It should be noted that the class can be re-used + * or turned into a tool for column viewers in general, but with some + * modifications. See example attached at the end of this class + * + * @since 3.7 + * + * @author Hitesh Soliwal + * + * @noextend This class is not intended to be subclassed by clients. + * + */ +abstract class ViewerColumnsDialog extends ViewSettingsDialog { + + /** The list contains columns that are currently visible in viewer */ + private List visible; + + /** The list contains columns that are note shown in viewer */ + private List nonVisible; + + /** + * The number of elements to show at Max. A zero value may indicate + * disablement of limit + */ + private int limitValue; + + /** The message area */ + private CLabel messageLabel; + + private TableViewer visibleViewer, nonVisibleViewer; + + private Button upButton, downButton; + + private Button toVisibleBtt, toNonVisibleBtt; + + private Text widthText, limitEditor; + + /** + * A listener to validate positive integer numbers only + */ + Listener postivIntTextListener = new Listener() { + + private String intialValue; + + public void handleEvent(Event event) { + intialValue = intialValue != null ? intialValue : Integer + .toString(0); + intialValue = handleIntegerFieldChange(event, intialValue); + } + }; + + /** + * Create a new instance of the receiver. + * + * @param parentShell + */ + ViewerColumnsDialog(Shell parentShell) { + super(parentShell); + } + + /** + * Initialize visible /non-visible columns. + * + * @param columnObjs + */ + void setColumnsObjs(Object[] columnObjs) { + IColumnInfoProvider columnInfo = doGetColumnInfoProvider(); + IColumnUpdater updater = doGetColumnUpdater(); + List visible = getVisible(); + List nonVisible = getNonVisible(); + visible.clear(); + nonVisible.clear(); + Object data = null; + for (int i = 0; i < columnObjs.length; i++) { + data = columnObjs[i]; + if (columnInfo.isColumnVisible(data)) { + updater.setColumnVisible(data, true); + updater.setColumnIndex(data, visible.size()); + visible.add(data); + } else { + updater.setColumnVisible(data, false); + updater.setColumnIndex(data, nonVisible.size()); + nonVisible.add(data); + } + } + } + + /* + * (non-Javadoc) + * + * @see + * org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets + * .Shell) + */ + protected void configureShell(Shell newShell) { + super.configureShell(newShell); + newShell.setText(JFaceResources + .getString("ConfigureColumnsDialog_Title")); //$NON-NLS-1$ + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.window.Window#getShellStyle() + */ + protected int getShellStyle() { + return super.getShellStyle() | SWT.RESIZE; + } + + /* + * (non-Javadoc) + * + * @see + * org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets + * .Composite) + */ + protected Control createDialogArea(Composite parent) { + + Composite dialogArea = (Composite) super.createDialogArea(parent); + + dialogArea.setLayout(new GridLayout(1, true)); + + initializeDialogUnits(dialogArea); + + createMessageArea(dialogArea); + + createLimitArea(dialogArea); + + createColumnsArea(dialogArea); + + applyDialogFont(dialogArea); + + initializeDlg(); + + return dialogArea; + } + + /** + * + */ + void initializeDlg() { + handleStatusUdpate(IStatus.INFO, getDefaultMessage()); + } + + /** + * Create message area. + * + * @param parent + */ + void createMessageArea(Composite parent) { + messageLabel = new CLabel(parent, SWT.NONE); + messageLabel.setImage(JFaceResources + .getImage(Dialog.DLG_IMG_MESSAGE_INFO)); + messageLabel + .setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false)); + } + + /** + * Create element limit area. + * + * @param parent + */ + void createLimitArea(Composite parent) { + Composite composite = new Group(parent, SWT.NONE); + composite.setLayout(new GridLayout(2, false)); + composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + + CLabel cLabel = new CLabel(composite, SWT.NONE); + cLabel.setText(MarkerMessages.MarkerPreferences_VisibleItems); + cLabel.setLayoutData(new GridData()); + + limitEditor = new Text(composite, SWT.BORDER); + limitEditor.setText(Integer.toString(getLimitValue())); + limitEditor.setLayoutData(new GridData()); + limitEditor.addListener(SWT.FocusOut, postivIntTextListener); + limitEditor.addListener(SWT.KeyDown, postivIntTextListener); + limitEditor.addListener(SWT.Modify, new Listener() { + public void handleEvent(Event event) { + int limit = 0; + try { + limit = Integer.parseInt(limitEditor.getText().trim()); + } catch (Exception e) { + return;// ignore this one + } + setLimitValue(limit); + } + }); + limitEditor.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + } + + /** + * Create the controls to configure columns. + * + * @param dialogArea + */ + void createColumnsArea(Composite dialogArea) { + Group columnArea = new Group(dialogArea, SWT.NONE); + columnArea.setLayout(new GridLayout(4, false)); + GridData gData = new GridData(GridData.FILL_BOTH + | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL); + columnArea.setLayoutData(gData); + columnArea.setText(MarkerMessages.MarkerPreferences_ColumnGroupTitle); + + createInvisibleTable(columnArea); + createMoveButtons(columnArea); + createVisibleTable(columnArea); + createUpDownBtt(columnArea); + createWidthArea(columnArea); + } + + /** + * The Up and Down button to change column ordering. + * + * @param parent + */ + void createUpDownBtt(Composite parent) { + Composite composite = new Composite(parent, SWT.NONE); + GridLayout layout = new GridLayout(1, true); + layout.horizontalSpacing = 0; + layout.marginRight = -1; + layout.marginLeft = -1; + layout.marginWidth = 0; + composite.setLayout(layout); + composite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL + | GridData.VERTICAL_ALIGN_END)); + upButton = new Button(composite, SWT.PUSH); + upButton.setText(JFaceResources.getString("ConfigureColumnsDialog_up")); //$NON-NLS-1$ + upButton.addListener(SWT.Selection, new Listener() { + public void handleEvent(Event event) { + handleUpButton(event); + } + }); + upButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + upButton.setEnabled(false); + + downButton = new Button(composite, SWT.PUSH); + downButton.setText(JFaceResources + .getString("ConfigureColumnsDialog_down")); //$NON-NLS-1$ + downButton.addListener(SWT.Selection, new Listener() { + public void handleEvent(Event event) { + handleDownButton(event); + } + }); + downButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + downButton.setEnabled(false); + } + + /** + * Create the controls responsible to display/edit column widths. + * + * @param parent + */ + void createWidthArea(Composite parent) { + Label widthLabel = new Label(parent, SWT.NONE); + widthLabel.setText(JFaceResources + .getString("ConfigureColumnsDialog_WidthOfSelectedColumn")); //$NON-NLS-1$ + GridData gridData = new GridData(GridData.FILL_HORIZONTAL + | GridData.HORIZONTAL_ALIGN_END); + gridData.horizontalSpan = 3; + widthLabel.setLayoutData(gridData); + + widthText = new Text(parent, SWT.SINGLE | SWT.BORDER); + widthText.setText(Integer.toString(0)); + gridData = new GridData(GridData.FILL_HORIZONTAL + | GridData.HORIZONTAL_ALIGN_CENTER); + gridData.widthHint = convertWidthInCharsToPixels(5); + widthText.setLayoutData(gridData); + widthText.addListener(SWT.KeyDown, postivIntTextListener); + widthText.addListener(SWT.FocusOut, postivIntTextListener); + widthText.addListener(SWT.Modify, new Listener() { + public void handleEvent(Event event) { + if (widthText.isEnabled()) { + int width = 0; + try { + width = Integer.parseInt(widthText.getText().trim()); + } catch (Exception e) { + return;// ignore this one + } + Object data = ((IStructuredSelection) visibleViewer + .getSelection()).getFirstElement(); + if (data != null) { + IColumnUpdater updater = getColumnUpdater(); + updater.setColumnWidth(data, width); + } + } + } + }); + widthText.setText(MarkerSupportInternalUtilities.EMPTY_STRING); + widthText.setEditable(false); + } + + /** + * Adapter to {@link IStructuredContentProvider} + */ + abstract class ContentProviderAdapter implements IStructuredContentProvider { + + public void dispose() { + } + + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + } + } + + /** + * Creates the table that lists out visible columns in the viewer + * + * @param parent + */ + void createVisibleTable(Composite parent) { + final Table table = new Table(parent, SWT.BORDER | SWT.MULTI); + GridData data = new GridData(SWT.FILL, SWT.FILL, true, true); + data.widthHint = convertWidthInCharsToPixels(30); + data.heightHint = table.getItemHeight() * 15; + table.setLayoutData(data); + table.setHeaderVisible(true); + + final TableColumn column = new TableColumn(table, SWT.NONE); + column.setText(MarkerMessages.MarkerPreferences_VisibleColumnsTitle); + Listener columnResize = new Listener() { + public void handleEvent(Event event) { + column.setWidth(table.getClientArea().width); + } + }; + table.addListener(SWT.Resize, columnResize); + + visibleViewer = new TableViewer(table); + visibleViewer.setLabelProvider(doGetLabelProvider()); + visibleViewer.setContentProvider(new ContentProviderAdapter() { + public Object[] getElements(Object inputElement) { + return getVisible().toArray(); + } + }); + visibleViewer + .addSelectionChangedListener(new ISelectionChangedListener() { + public void selectionChanged(SelectionChangedEvent event) { + handleVisibleSelection(event.getSelection()); + } + }); + table.addListener(SWT.MouseDoubleClick, new Listener() { + public void handleEvent(Event event) { + handleToNonVisibleButton(event); + } + }); + visibleViewer.setInput(this); + } + + /** + * Creates the table that lists out non-visible columns in the viewer + * + * @param parent + */ + void createInvisibleTable(Composite parent) { + final Table table = new Table(parent, SWT.BORDER | SWT.MULTI); + GridData data = new GridData(SWT.FILL, SWT.FILL, true, true); + data.widthHint = convertWidthInCharsToPixels(30); + data.heightHint = table.getItemHeight() * 15; + table.setLayoutData(data); + table.setHeaderVisible(true); + + final TableColumn column = new TableColumn(table, SWT.NONE); + column.setText(MarkerMessages.MarkerPreferences_HiddenColumnsTitle); + Listener columnResize = new Listener() { + public void handleEvent(Event event) { + column.setWidth(table.getClientArea().width); + } + }; + table.addListener(SWT.Resize, columnResize); + + nonVisibleViewer = new TableViewer(table); + nonVisibleViewer.setLabelProvider(doGetLabelProvider()); + nonVisibleViewer.setContentProvider(new ContentProviderAdapter() { + public Object[] getElements(Object inputElement) { + return getNonVisible().toArray(); + } + }); + nonVisibleViewer + .addSelectionChangedListener(new ISelectionChangedListener() { + public void selectionChanged(SelectionChangedEvent event) { + handleNonVisibleSelection(event.getSelection()); + } + }); + table.addListener(SWT.MouseDoubleClick, new Listener() { + public void handleEvent(Event event) { + handleToVisibleButton(event); + } + }); + nonVisibleViewer.setInput(this); + } + + /** + * Creates buttons for moving columns from non-visible to visible and + * vice-versa + * + * @param parent + */ + void createMoveButtons(Composite parent) { + Composite bttArea = new Composite(parent, SWT.NONE); + bttArea.setLayout(new GridLayout(1, true)); + bttArea.setLayoutData(new GridData(GridData.FILL_VERTICAL)); + + toNonVisibleBtt = new Button(bttArea, SWT.PUSH); + toNonVisibleBtt + .setText(getDefaultOrientation() == SWT.RIGHT_TO_LEFT ? MarkerMessages.MarkerPreferences_MoveRight + : MarkerMessages.MarkerPreferences_MoveLeft); + toNonVisibleBtt.setLayoutData(new GridData()); + + toNonVisibleBtt.addListener(SWT.Selection, new Listener() { + public void handleEvent(Event event) { + handleToNonVisibleButton(event); + } + }); + toNonVisibleBtt.setEnabled(false); + + toVisibleBtt = new Button(bttArea, SWT.PUSH); + toVisibleBtt + .setText(getDefaultOrientation() == SWT.RIGHT_TO_LEFT ? MarkerMessages.MarkerPreferences_MoveLeft + : MarkerMessages.MarkerPreferences_MoveRight); + toVisibleBtt.setLayoutData(new GridData()); + toVisibleBtt.addListener(SWT.Selection, new Listener() { + public void handleEvent(Event event) { + handleToVisibleButton(event); + } + }); + toVisibleBtt.setEnabled(false); + } + + /** + * Display the error message and an appropriate icon. + * + * @param messgage + * @param severity + */ + protected void handleStatusUdpate(int severity, String messgage) { + Image image = null; + switch (severity) { + case IStatus.ERROR: { + if (messgage == null) { + messgage = getErrorMessage(); + } + image = getErrorImage(); + break; + } + case IStatus.WARNING: { + image = getWarningImage(); + break; + } + case IStatus.OK: + case IStatus.INFO: + default: + image = getInfoImage(); + } + messageLabel.setImage(image); + if (messgage == null) { + messgage = getDefaultMessage(); + } + if (messgage == null) { + messgage = MarkerSupportInternalUtilities.EMPTY_STRING; + } + messageLabel.setText(messgage); + } + + /** + * Return the message to display when dialog is opened. + */ + protected String getDefaultMessage() { + return MarkerMessages.MarkerPreferences_ZeroOrBlankValueCanBeUsedToDisableTheLimit; + } + + /** + * @return Returns the error message to display for a wrong limit value. + */ + protected String getErrorMessage() { + return JFaceResources.getString("IntegerFieldEditor.errorMessage"); //$NON-NLS-1$ + } + + /** + */ + protected Image getInfoImage() { + return JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_INFO); + } + + /** + */ + protected Image getWarningImage() { + return JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_WARNING); + } + + /** + */ + protected Image getErrorImage() { + return JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_ERROR); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.ui.preferences.ViewSettingsDialog#performDefaults() + */ + protected void performDefaults() { + refreshViewers(); + super.performDefaults(); + } + + /** + * + * @param event + * @param intialvalue + * @return new integer value + */ + String handleIntegerFieldChange(Event event, String intialvalue) { + Text text = (Text) event.widget; + String value = text.getText().trim(); + switch (event.type) { + case SWT.KeyDown: + if (!Character.isDigit(event.character)) { + if (!Character.isISOControl(event.character)) { + handleStatusUdpate(IStatus.ERROR, getErrorMessage()); + event.doit = false; + return intialvalue; + } + } + case SWT.FocusOut: + if (value.length() == 0) { + value = Integer.toString(0); + text.setText(value); + text.selectAll(); + handleStatusUdpate(IStatus.INFO, null); + } else { + try { + Integer.parseInt(value); + handleStatusUdpate(IStatus.INFO, null); + } catch (Exception e) { + value = intialvalue; + text.setText(value); + text.selectAll(); + handleStatusUdpate(IStatus.ERROR, getErrorMessage()); + event.doit = false; + } + } + } + return value; + } + + /** + * Handles a selection change in the viewer that lists out the non-visible + * columns + * + * @param selection + */ + void handleNonVisibleSelection(ISelection selection) { + Object[] nvKeys = ((IStructuredSelection) selection).toArray(); + toVisibleBtt.setEnabled(nvKeys.length > 0); + } + + /** + * Handles a selection change in the viewer that lists out the visible + * columns. Takes care of various enablements. + * + * @param selection + */ + void handleVisibleSelection(ISelection selection) { + List selVCols = ((IStructuredSelection) selection).toList(); + List allVCols = getVisible(); + toNonVisibleBtt.setEnabled(selVCols.size() > 0 + && allVCols.size() > selVCols.size()); + + IColumnInfoProvider infoProvider = doGetColumnInfoProvider(); + boolean moveDown = !selVCols.isEmpty(), moveUp = !selVCols.isEmpty(); + Iterator iterator = selVCols.iterator(); + while (iterator.hasNext()) { + Object columnObj = iterator.next(); + if (!infoProvider.isColumnMovable(columnObj)) { + moveUp = false; + moveDown = false; + break; + } + int i = allVCols.indexOf(columnObj); + if (i == 0) { + moveUp = false; + if (!moveDown) { + break; + } + } + if (i == (allVCols.size() - 1)) { + moveDown = false; + if (!moveUp) { + break; + } + } + } + upButton.setEnabled(moveUp); + downButton.setEnabled(moveDown); + + boolean edit = selVCols.size() == 1 ? infoProvider + .isColumnResizable(selVCols.get(0)) : false; + if (edit) { + widthText.setText(Integer.toString(infoProvider + .getColumnWidth(selVCols.get(0)))); + } else { + widthText.setText(Integer.toString(0)); + } + widthText.setEditable(edit); + } + + /** + * Applies to visible columns, and handles the changes in the order of + * columns + * + * @param e + * event from the button click + */ + void handleDownButton(Event e) { + IStructuredSelection selection = (IStructuredSelection) visibleViewer + .getSelection(); + Object[] selVCols = selection.toArray(); + List allVCols = getVisible(); + IColumnUpdater updater = doGetColumnUpdater(); + for (int i = selVCols.length - 1; i >= 0; i--) { + Object colObj = selVCols[i]; + int index = allVCols.indexOf(colObj); + updater.setColumnIndex(colObj, index + 1); + allVCols.remove(index); + allVCols.add(index + 1, colObj); + } + visibleViewer.refresh(); + handleVisibleSelection(selection); + } + + /** + * Applies to visible columns, and handles the changes in the order of + * columns + * + * @param e + * event from the button click + */ + void handleUpButton(Event e) { + IStructuredSelection selection = (IStructuredSelection) visibleViewer + .getSelection(); + Object[] selVCols = selection.toArray(); + List allVCols = getVisible(); + IColumnUpdater updater = doGetColumnUpdater(); + for (int i = 0; i < selVCols.length; i++) { + Object colObj = selVCols[i]; + int index = allVCols.indexOf(colObj); + updater.setColumnIndex(colObj, index - 1); + allVCols.remove(index); + allVCols.add(index - 1, colObj); + } + visibleViewer.refresh(); + handleVisibleSelection(selection); + } + + /** + * Moves selected columns from non-visible to visible state + * + * @param e + * event from the button click + */ + void handleToVisibleButton(Event e) { + IStructuredSelection selection = (IStructuredSelection) nonVisibleViewer + .getSelection(); + List selVCols = selection.toList(); + List nonVisible = getNonVisible(); + nonVisible.removeAll(selVCols); + + List list = getVisible(); + list.addAll(selVCols); + + updateVisibility(selVCols, true); + updateIndices(getVisible()); + updateIndices(getNonVisible()); + + visibleViewer.refresh(); + visibleViewer.setSelection(selection); + nonVisibleViewer.refresh(); + handleVisibleSelection(selection); + handleNonVisibleSelection(nonVisibleViewer.getSelection()); + } + + /** + * Moves selected columns from visible to non-visible state + * + * @param e + * event from the button click + */ + protected void handleToNonVisibleButton(Event e) { + if (getVisible().size() <= 1) { + handleStatusUdpate(IStatus.INFO, + MarkerMessages.MarkerPreferences_AtLeastOneVisibleColumn); + return; + } + IStructuredSelection selection = (IStructuredSelection) visibleViewer + .getSelection(); + List selVCols = selection.toList(); + getVisible().removeAll(selVCols); + getNonVisible().addAll(selVCols); + + updateVisibility(selVCols, false); + updateIndices(getVisible()); + updateIndices(getNonVisible()); + + nonVisibleViewer.refresh(); + nonVisibleViewer.setSelection(selection); + visibleViewer.refresh(); + handleVisibleSelection(visibleViewer.getSelection()); + handleNonVisibleSelection(nonVisibleViewer.getSelection()); + handleStatusUdpate(IStatus.INFO, getDefaultMessage()); + } + + void updateIndices(List list) { + ListIterator iterator = list.listIterator(); + IColumnUpdater updater = doGetColumnUpdater(); + while (iterator.hasNext()) { + updater.setColumnIndex(iterator.next(), iterator.previousIndex()); + } + } + + void updateVisibility(List list, boolean visibility) { + IColumnUpdater updater = doGetColumnUpdater(); + Iterator iterator = list.iterator(); + while (iterator.hasNext()) { + updater.setColumnVisible(iterator.next(), visibility); + } + } + + /** + * Updates the UI based on values of the variable + */ + void refreshViewers() { + if (limitEditor != null) { + limitEditor.setText(Integer.toString(getLimitValue())); + } + if (nonVisibleViewer != null) { + nonVisibleViewer.refresh(); + } + if (visibleViewer != null) { + visibleViewer.refresh(); + } + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.dialogs.Dialog#isResizable() + */ + protected boolean isResizable() { + return true; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.dialogs.Dialog#okPressed() + */ + protected void okPressed() { + super.okPressed(); + } + + /** + * @return Returns the limitValue. + */ + public int getLimitValue() { + return limitValue; + } + + /** + * @param limitValue + * The limitValue to set. + */ + void setLimitValue(int limitValue) { + this.limitValue = limitValue; + } + + /** + * @return List of visible columns + */ + public List getVisible() { + if (visible == null) { + visible = new ArrayList(); + } + return visible; + } + + /** + * @return List of non-visible columns + */ + public List getNonVisible() { + if (nonVisible == null) { + nonVisible = new ArrayList(); + } + return nonVisible; + } + + /** + * An adapter class to {@link ITableLabelProvider} + * + */ + class TableLabelProvider extends LabelProvider implements + ITableLabelProvider { + public Image getColumnImage(Object element, int columnIndex) { + return null; + } + + public String getColumnText(Object element, int columnIndex) { + return getText(element); + } + } + + /** + * Internal helper to @see {@link ViewerColumnsDialog#getLabelProvider()} + */ + ITableLabelProvider doGetLabelProvider() { + return getLabelProvider(); + } + + /** + * The tables-columns need to be displayed appropriately. The supplied + * column objects are adapted to text and image as dictacted by this + * {@link ITableLabelProvider} + */ + protected abstract ITableLabelProvider getLabelProvider(); + + /** + * Internal helper to @see + * {@link ViewerColumnsDialog#getColumnInfoProvider()} + */ + IColumnInfoProvider doGetColumnInfoProvider() { + return getColumnInfoProvider(); + } + + /** + * To configure the columns we need further information. The supplied column + * objects are adapted for its properties via {@link IColumnInfoProvider} + */ + protected abstract IColumnInfoProvider getColumnInfoProvider(); + + /** + * Internal helper to @see {@link ViewerColumnsDialog#getColumnUpdater()} + */ + IColumnUpdater doGetColumnUpdater() { + return getColumnUpdater(); + } + + /** + * To configure properties/order of the columns is achieved via + * {@link IColumnUpdater} + */ + protected abstract IColumnUpdater getColumnUpdater(); + + /** + * Update various aspects of a columns from a viewer such + * {@link TableViewer} + */ + public interface IColumnInfoProvider { + + /** + * Get corresponding index for the column + * + * @param columnObj + */ + public int getColumnIndex(Object columnObj); + + /** + * Get the width of the column + * + * @param columnObj + */ + public int getColumnWidth(Object columnObj); + + /** + * Returns true if the column represented by parameters is showing in + * the viewer + * + * @param columnObj + */ + public boolean isColumnVisible(Object columnObj); + + /** + * Returns true if the column represented by parameters is configured as + * movable + * + * @param columnObj + */ + public boolean isColumnMovable(Object columnObj); + + /** + * Returns true if the column represented by parameters is configured as + * resizable + * + * @param columnObj + */ + public boolean isColumnResizable(Object columnObj); + + } + + /** + * Update various aspects of a columns from a viewer such + * {@link TableViewer} + */ + public interface IColumnUpdater { + + /** + * Set the column represented by parameters as visible + * + * @param columnObj + * @param visible + */ + public void setColumnVisible(Object columnObj, boolean visible); + + /** + * Dummy method - more a result of symmetry + * + * @param columnObj + * @param movable + */ + public void setColumnMovable(Object columnObj, boolean movable); + + /** + * Call back to notify change in the index of the column represented by + * columnObj + * + * @param columnObj + * @param index + */ + public void setColumnIndex(Object columnObj, int index); + + /** + * Dummy method - more a result of symmetry + * + * @param columnObj + * @param resizable + */ + public void setColumnResizable(Object columnObj, boolean resizable); + + /** + * Call back to notify change in the width of the column represented by + * columnObj + * + * @param columnObj + * @param newWidth + */ + public void setColumnWidth(Object columnObj, int newWidth); + + } + + // ////////////////////////////////////////////////////////////////////////////////// + /** + * Ignore the class below as it is simply meant to test the above. I intend + * to retain this for a while. + */ + static class TestData { + + final Object key; + + final int keyIndex; + + int newIndex, width; + + boolean visibility, movable, resizable; + + TestData(Object key, int currIndex) { + this.key = key; + this.keyIndex = currIndex; + } + + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((key == null) ? 0 : key.hashCode()); + result = prime * result + keyIndex; + return result; + } + + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (!(obj instanceof TestData)) { + return false; + } + TestData other = (TestData) obj; + if (key == null) { + if (other.key != null) { + return false; + } + } else if (!key.equals(other.key)) { + return false; + } + if (keyIndex != other.keyIndex) { + return false; + } + return true; + } + + public String toString() { + return key.toString(); + } + + private static ViewerColumnsDialog getColumnsDialog(Shell shell, + final TestData[] colums) { + ViewerColumnsDialog dialog = new ViewerColumnsDialog(shell) { + + protected IColumnInfoProvider getColumnInfoProvider() { + return getInfoProvider(colums); + } + + protected ITableLabelProvider getLabelProvider() { + return new TableLabelProvider(); + } + + protected IColumnUpdater getColumnUpdater() { + return getUpdater(colums); + } + }; + dialog.setColumnsObjs(colums); + return dialog; + } + + private static IColumnUpdater getUpdater(final TestData[] data) { + return new IColumnUpdater() { + + public void setColumnWidth(Object columnObj, int newWidth) { + ((TestData) columnObj).width = newWidth; + } + + public void setColumnVisible(Object columnObj, boolean visible) { + ((TestData) columnObj).visibility = visible; + } + + public void setColumnResizable(Object columnObj, + boolean resizable) { + + } + + public void setColumnMovable(Object columnObj, boolean movable) { + ((TestData) columnObj).movable = movable; + + } + + public void setColumnIndex(Object columnObj, int index) { + ((TestData) columnObj).newIndex = index; + } + }; + } + + private static IColumnInfoProvider getInfoProvider( + final TestData[] colData) { + return new IColumnInfoProvider() { + + public boolean isColumnVisible(Object columnObj) { + return ((TestData) columnObj).visibility; + } + + public boolean isColumnResizable(Object columnObj) { + return ((TestData) columnObj).resizable; + } + + public boolean isColumnMovable(Object columnObj) { + return ((TestData) columnObj).movable; + } + + public int getColumnWidth(Object columnObj) { + return ((TestData) columnObj).width; + } + + public int getColumnIndex(Object columnObj) { + return ((TestData) columnObj).newIndex; + } + }; + } + + private static TestData[] genData(int count) { + String[] cols = new String[count]; + for (int i = 0; i < cols.length; i++) { + cols[i] = new String("Column-" + (i + 1)); //$NON-NLS-1$ + } + Random random = new Random(); + + boolean[] visibility = new boolean[cols.length]; + Arrays.fill(visibility, true); + int ranInt = random.nextInt() % cols.length; + for (int i = 0; i < ranInt; i++) { + visibility[random.nextInt(ranInt)] = false; + } + + boolean[] resizable = new boolean[cols.length]; + Arrays.fill(resizable, true); + ranInt = random.nextInt() % cols.length; + for (int i = 0; i < ranInt; i++) { + resizable[random.nextInt(ranInt)] = false; + } + + boolean[] movable = new boolean[cols.length]; + Arrays.fill(movable, true); + ranInt = random.nextInt() % cols.length; + for (int i = 0; i < ranInt; i++) { + movable[random.nextInt(ranInt)] = false; + } + + int[] widths = new int[cols.length]; + Arrays.fill(widths, 100); + return TestData.generateColumnsData(cols, visibility, resizable, + movable, widths); + } + + public static TestData[] generateColumnsData(Object[] keys, + boolean[] visibility, boolean[] resizable, boolean[] movable, + int[] widths) { + TestData[] colData = new TestData[keys.length]; + int m = 0, n = 0; + for (int i = 0; i < colData.length; i++) { + TestData data = new TestData(keys[i], i); + data.visibility = visibility[i]; + data.resizable = resizable[i]; + data.movable = movable[i]; + data.width = widths[i]; + if (data.visibility) { + data.newIndex = m++; + } else { + data.newIndex = n++; + } + colData[i] = data; + } + return colData; + } + + /** + * Demo + * + * @param args + */ + public static void main(String[] args) { + Display display = new Display(); + final Shell shell = new Shell(display); + shell.setLayout(new FillLayout()); + ViewerColumnsDialog dialog = getColumnsDialog(shell, genData(100)); + dialog.open(); + shell.dispose(); + while (!shell.isDisposed()) { + if (!display.readAndDispatch()) { + display.sleep(); + } + } + display.dispose(); + + } + + } + + // ////////////////////////////////////////////////////////////////////////////////// +} Index: src/org/eclipse/ui/views/markers/MarkerField.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/MarkerField.java,v retrieving revision 1.11 diff -u -r1.11 MarkerField.java --- src/org/eclipse/ui/views/markers/MarkerField.java 12 Oct 2010 14:48:48 -0000 1.11 +++ src/org/eclipse/ui/views/markers/MarkerField.java 19 Nov 2010 14:38:04 -0000 @@ -255,7 +255,7 @@ */ public void update(ViewerCell cell) { cell.setText(getValue((MarkerItem) cell.getElement())); - + cell.setImage(null); } } Index: src/org/eclipse/ui/views/markers/internal/MarkerMessages.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/MarkerMessages.java,v retrieving revision 1.70 diff -u -r1.70 MarkerMessages.java --- src/org/eclipse/ui/views/markers/internal/MarkerMessages.java 13 Oct 2010 15:21:07 -0000 1.70 +++ src/org/eclipse/ui/views/markers/internal/MarkerMessages.java 19 Nov 2010 14:38:04 -0000 @@ -219,6 +219,7 @@ public static String MarkerPreferences_VisibleColumnsTitle; public static String MarkerPreferences_HiddenColumnsTitle; public static String MarkerPreferences_AtLeastOneVisibleColumn; + public static String MarkerPreferences_ZeroOrBlankValueCanBeUsedToDisableTheLimit; public static String ProblemFilterDialog_System_Filters_Title; public static String ProblemFilterDialog_All_Problems; Index: src/org/eclipse/ui/views/markers/internal/messages.properties =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.ui.ide/src/org/eclipse/ui/views/markers/internal/messages.properties,v retrieving revision 1.95 diff -u -r1.95 messages.properties --- src/org/eclipse/ui/views/markers/internal/messages.properties 13 Oct 2010 15:21:07 -0000 1.95 +++ src/org/eclipse/ui/views/markers/internal/messages.properties 19 Nov 2010 14:38:04 -0000 @@ -197,12 +197,13 @@ MarkerPreferences_DialogTitle = Preferences MarkerPreferences_MarkerLimits = Use marker &limits MarkerPreferences_VisibleItems = Limit visible &items per group to: -MarkerPreferences_MoveLeft = << -MarkerPreferences_MoveRight = >> +MarkerPreferences_MoveLeft = &<< +MarkerPreferences_MoveRight = &>> MarkerPreferences_ColumnGroupTitle = Hide/Show Columns MarkerPreferences_VisibleColumnsTitle = &Show MarkerPreferences_HiddenColumnsTitle = &Hide MarkerPreferences_AtLeastOneVisibleColumn = There must be at least one visible column. +MarkerPreferences_ZeroOrBlankValueCanBeUsedToDisableTheLimit = Please enter a positive number (zero or blank can be used to disable the limit). ProblemFilterDialog_System_Filters_Title = System filte&rs: ProblemFilterDialog_All_Problems = Enabled for all problems