/*******************************************************************************
* Copyright (c) 2008, 2011 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.resource.JFaceResources;
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.views.markers.MarkerField;
/**
* MarkersViewSettingDialog is the dialog for showing marker preferences.
*
*
* @since 3.7
* @author Hitesh Soliwal
*
*/
public class MarkersViewColumnsDialog extends ViewerColumnsDialog {
private ExtendedMarkersView extendedView;
/**
* Create a new instance of the receiver.
*
* @param view
* - the view this is being launched from
*/
public MarkersViewColumnsDialog(ExtendedMarkersView view) {
super(view.getSite().getShell());
this.extendedView = view;
initialize(false);
}
/*
* (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) {
Control control = super.createDialogArea(parent);
return control;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.dialogs.Dialog#okPressed()
*/
protected void okPressed() {
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;
i++;
}
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(true);
super.performDefaults();
}
/**
*/
void initialize(boolean defaultWidths) {
MarkerField[] allFields = extendedView.getBuilder().getGenerator()
.getAllFields();
MarkerField[] visibleFields = null;
if (defaultWidths) {
visibleFields = extendedView.getBuilder().getGenerator()
.getInitialVisible();
} else {
visibleFields = extendedView.getBuilder().getGenerator()
.getVisibleFields();
}
List visible = getVisible();
List nonVisible = getNonVisible();
visible.clear();
nonVisible.clear();
FieldEntry entry = null;
for (int i = 0; i < allFields.length; i++) {
if (!contains(visibleFields, allFields[i])) {
entry = new FieldEntry(allFields[i], -1);
entry.width = extendedView.getFieldWidth(entry.field,
defaultWidths ? 0 : -1, !defaultWidths);
entry.visible = false;
nonVisible.add(entry);
}
}
for (int i = 0; i < visibleFields.length; i++) {
entry = new FieldEntry(visibleFields[i], -1);
entry.width = extendedView.getFieldWidth(entry.field,
defaultWidths ? 0 : -1, !defaultWidths);
entry.visible = true;
visible.add(entry);
}
}
/**
* @param visibleFields
* @param field
*/
private boolean contains(MarkerField[] visibleFields, MarkerField field) {
for (int i = 0; i < visibleFields.length; i++) {
if (visibleFields[i].equals(field)) {
return true;
}
}
return false;
}
/*
* (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;
if (field.width <= 0) {
field.width = extendedView.getFieldWidth(field.field,
field.width, false);
}
return 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;
}
};
}
static class FieldEntry {
final MarkerField field;
int width;
boolean visible;
FieldEntry(MarkerField field, int width) {
this.field = field;
this.width = width;
visible = false;
}
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((field == null) ? 0 : field.hashCode());
return result;
}
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
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;
}
}
}