/**
* This file Copyright (c) 2005-2008 Aptana, Inc. This program is
* dual-licensed under both the Aptana Public License and the GNU General
* Public license. You may elect to use one or the other of these licenses.
*
* This program is distributed in the hope that it will be useful, but
* AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
* NONINFRINGEMENT. Redistribution, except as permitted by whichever of
* the GPL or APL you select, is prohibited.
*
* 1. For the GPL license (GPL), you can redistribute and/or modify this
* program under the terms of the GNU General Public License,
* Version 3, as published by the Free Software Foundation. You should
* have received a copy of the GNU General Public License, Version 3 along
* with this program; if not, write to the Free Software Foundation, Inc., 51
* Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Aptana provides a special exception to allow redistribution of this file
* with certain other free and open source software ("FOSS") code and certain additional terms
* pursuant to Section 7 of the GPL. You may view the exception and these
* terms on the web at http://www.aptana.com/legal/gpl/.
*
* 2. For the Aptana Public License (APL), this program and the
* accompanying materials are made available under the terms of the APL
* v1.0 which accompanies this distribution, and is available at
* http://www.aptana.com/legal/apl/.
*
* You may view the GPL, Aptana's exception and additional terms, and the
* APL in the file titled license.html at the root of the corresponding
* plugin containing this source file.
*
* Any modifications to this file must keep this entire header intact.
*/
package com.aptana.ide.logging.preferences;
import java.io.File;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.ColorSelector;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceConverter;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CheckboxCellEditor;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.FontDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Item;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.forms.events.ExpansionAdapter;
import org.eclipse.ui.forms.events.ExpansionEvent;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.internal.editors.text.EditorsPlugin;
import org.eclipse.ui.texteditor.AbstractDecoratedTextEditorPreferenceConstants;
import org.eclipse.ui.texteditor.AbstractTextEditor;
import com.aptana.ide.core.IdeLog;
import com.aptana.ide.core.StringUtils;
import com.aptana.ide.core.ui.CoreUIPlugin;
import com.aptana.ide.core.ui.SWTUtils;
import com.aptana.ide.editors.UnifiedEditorsPlugin;
import com.aptana.ide.editors.preferences.ColorCellEditor;
import com.aptana.ide.editors.preferences.ColorizationScrolledComposite;
import com.aptana.ide.editors.preferences.IPreferenceConstants;
import com.aptana.ide.editors.unified.UnifiedColorManager;
import com.aptana.ide.editors.unified.colorizer.ColorizationConstants;
import com.aptana.ide.editors.unified.colorizer.ColorizationStyle;
import com.aptana.ide.editors.unified.colorizer.IErrorHandler;
import com.aptana.ide.editors.unified.colorizer.Region;
import com.aptana.ide.editors.unified.colorizer.LanguageStructureProvider.Category;
import com.aptana.ide.lexer.IToken;
import com.aptana.ide.lexer.LexerException;
import com.aptana.ide.logging.LoggingPlugin;
import com.aptana.ide.logging.LoggingPreferences;
/**
* @author Kevin Sawicki (ksawicki@aptana.com)
* @author Denis Denisenko
*/
public class LoggingPreferenceWidget
{
private ColorizationScrolledComposite scrolls;
//private ExpandableComposite regionExpandable; @regions
private ExpandableComposite tokenExpandable;
private ExpandableComposite editorExpandable;
private Label description;
private Composite displayArea;
private TreeViewer viewer;
private Tree tree;
//private Table table; @regions
//private TableViewer regionViewer; @regions
private RGB black;
private LoggingStructureProvider provider;
private Button importButton;
private Button exportButton;
//private Button remove; @regions
//private Button addRegion; @regions
private Button override;
private ColorSelector backgroundSelector;
private ColorSelector lineHighlightSelector;
private ColorSelector selectionForegroundSelector;
private ColorSelector selectionBackgroundSelector;
private ColorSelector foldingBackgroundSelector;
private ColorSelector foldingForegroundSelector;
private ColorSelector caretSelector;
private Composite coloringComposite;
private IErrorHandler errorHandler;
private static final Object INPUT = new Object();
private static final String[] COLUMNS = { "!", "Token", "R", "FG", "B", "I", "U" }; //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$
private static final String[] REGION_COLUMNS = { "Name", "Offset", "Length", "FG", "B", "I", "U" }; //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$
private static final String[] REGION_TABLE_COLUMNS = { "Name", "Offset", "Length", "", "", "", "" }; //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$
private static final int ICON_COLUMN_WIDTH = 17;
/**
* Min read timeout.
*/
protected static final int MIN_READ_TIMEOUT = 50;
private IStructuredContentProvider regionContentProvider = new IStructuredContentProvider()
{
public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
{
}
public void dispose()
{
}
public Object[] getElements(Object inputElement)
{
if (inputElement instanceof Map)
{
Map map = (Map) inputElement;
return map.values().toArray();
}
return null;
}
};
private ITableLabelProvider nullLabelProvider = new ITableLabelProvider()
{
public void removeListener(ILabelProviderListener listener)
{
}
public boolean isLabelProperty(Object element, String property)
{
return false;
}
public void dispose()
{
}
public void addListener(ILabelProviderListener listener)
{
}
public String getColumnText(Object element, int columnIndex)
{
return ""; //$NON-NLS-1$
}
public Image getColumnImage(Object element, int columnIndex)
{
return null;
}
};
private ITreeContentProvider nullContentProvider = new ITreeContentProvider()
{
public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
{
}
public void dispose()
{
}
public Object[] getElements(Object inputElement)
{
return new Object[0];
}
public boolean hasChildren(Object element)
{
return false;
}
public Object getParent(Object element)
{
return null;
}
public Object[] getChildren(Object parentElement)
{
return new Object[0];
}
};
private ITableLabelProvider regionLabelProvider = new ITableLabelProvider()
{
private Map imageMap = new HashMap();
public void removeListener(ILabelProviderListener listener)
{
}
public boolean isLabelProperty(Object element, String property)
{
return false;
}
public void dispose()
{
Iterator iter = imageMap.values().iterator();
while (iter.hasNext())
{
((Image) iter.next()).dispose();
}
}
public void addListener(ILabelProviderListener listener)
{
}
public String getColumnText(Object element, int columnIndex)
{
Region region = (Region) element;
if (columnIndex == 0)
{
return region.getName();
}
if (columnIndex == 1)
{
return region.getOffsetString();
}
if (columnIndex == 2)
{
return region.getLengthString();
}
return null;
}
public Image getColumnImage(Object element, int columnIndex)
{
Region region = (Region) element;
ColorizationStyle style = region.getStyle();
if (columnIndex == 3)
{
if (style != null)
{
Color fg = style.getForegroundColor();
Image img = null;
if (!imageMap.containsKey(fg.getRGB()))
{
img = new Image(Display.getCurrent(), 16, 16);
GC gc = new GC(img);
gc.setBackground(fg);
gc.fillRectangle(1, 1, 13, 13);
gc.setForeground(UnifiedColorManager.getInstance().getColor(new RGB(0, 0, 0)));
gc.drawRectangle(1, 1, 13, 13);
gc.dispose();
imageMap.put(fg.getRGB(), img);
}
else
{
img = (Image) imageMap.get(fg.getRGB());
}
return img;
}
}
if (columnIndex == 4)
{
if (style != null && style.isBold())
{
return UnifiedEditorsPlugin.getImage("icons/bold_on.gif"); //$NON-NLS-1$
}
else
{
return UnifiedEditorsPlugin.getImage("icons/bold_off.gif"); //$NON-NLS-1$
}
}
if (columnIndex == 5)
{
if (style != null && style.isItalic())
{
return UnifiedEditorsPlugin.getImage("icons/italic_on.gif"); //$NON-NLS-1$
}
else
{
return UnifiedEditorsPlugin.getImage("icons/italic_off.gif"); //$NON-NLS-1$
}
}
if (columnIndex == 6)
{
if (style != null && style.isUnderline())
{
return UnifiedEditorsPlugin.getImage("icons/underline_on.gif"); //$NON-NLS-1$
}
else
{
return UnifiedEditorsPlugin.getImage("icons/underline_off.gif"); //$NON-NLS-1$
}
}
return null;
}
};
/**
* Disposes this colorization widget
*/
public void dispose()
{
if (provider != null)
{
provider.disposeImages();
}
regionLabelProvider.dispose();
}
private ICellModifier regionModifier = new ICellModifier()
{
public void modify(Object element, String property, Object value)
{
if (element instanceof Item)
{
element = ((Item) element).getData();
}
ColorizationStyle style = null;
if (element instanceof Region)
{
style = ((Region) element).getStyle();
}
if (style != null)
{
if (value instanceof Boolean)
{
Boolean bool = (Boolean) value;
if (property == REGION_COLUMNS[4])
{
style.setBold(bool.booleanValue());
}
else if (property == REGION_COLUMNS[5])
{
style.setItalic(bool.booleanValue());
}
else if (property == REGION_COLUMNS[6])
{
style.setUnderline(bool.booleanValue());
}
}
else if (value instanceof RGB)
{
RGB rgb = (RGB) value;
if (property == REGION_COLUMNS[3])
{
style.setForegroundColor(UnifiedColorManager.getInstance().getColor(rgb));
}
}
else if (value instanceof String)
{
String text = (String) value;
Region region = (Region) element;
if (property == REGION_COLUMNS[0])
{
IToken token = (IToken) viewer.getTree().getSelection()[0].getData();
provider.removeRegion(token, region.getName());
region.setName(text);
provider.addRegion(token, region);
}
else if (property == REGION_COLUMNS[1])
{
int offsetInt;
boolean offsetRelative = false;
try
{
if (text.startsWith(ColorizationConstants.LENGTH_KEYWORD))
{
offsetInt = Integer.parseInt(text.substring(ColorizationConstants.LENGTH_KEYWORD.length(),
text.length()));
offsetRelative = true;
}
else
{
offsetInt = Integer.parseInt(text);
}
region.setOffset(offsetInt);
region.setRelativeOffset(offsetRelative);
region.setOffsetString(text);
}
catch (Exception e1)
{
}
}
else if (property == REGION_COLUMNS[2])
{
int lengthInt;
boolean lengthRelative = false;
try
{
if (text.startsWith(ColorizationConstants.LENGTH_KEYWORD))
{
lengthInt = Integer.parseInt(text.substring(ColorizationConstants.LENGTH_KEYWORD.length(),
text.length()));
lengthRelative = true;
}
else
{
lengthInt = Integer.parseInt(text);
}
region.setLength(lengthInt);
region.setRelativeLength(lengthRelative);
region.setLengthString(text);
}
catch (Exception e1)
{
}
}
}
}
//regionViewer.update(element, null); @regions
}
public Object getValue(Object element, String property)
{
ColorizationStyle style = null;
if (element instanceof Region)
{
style = ((Region) element).getStyle();
}
if (style != null)
{
if (property == REGION_COLUMNS[0])
{
return ((Region) element).getName();
}
else if (property == REGION_COLUMNS[1])
{
return ((Region) element).getOffsetString();
}
else if (property == REGION_COLUMNS[2])
{
return ((Region) element).getLengthString();
}
else if (property == REGION_COLUMNS[3])
{
return style.getForegroundColor().getRGB();
}
else if (property == REGION_COLUMNS[4])
{
return Boolean.valueOf(style.isBold());
}
else if (property == REGION_COLUMNS[5])
{
return Boolean.valueOf(style.isItalic());
}
else if (property == REGION_COLUMNS[6])
{
return Boolean.valueOf(style.isUnderline());
}
}
return null;
}
public boolean canModify(Object element, String property)
{
return true;
}
};
/**
* Add string-based rule button.
*/
private Button addStringRuleButton;
/**
* Remove rule button.
*/
private Button removeRuleButton;
/**
* Edit rule button.
*/
private Button editRuleButton;
/**
* Add regexp rule button.
*/
private Button addRegexpRuleButton;
/**
* Autobolding composite.
*/
private Composite autoboldingComposite;
/**
* AUtobolding checkbox.
*/
private Button autoboldingBox;
/**
* Up Rule button.
*/
private Button upRuleButton;
/**
* Down Rule button.
*/
private Button downRuleButton;
/**
* Wrapping checkbox.
*/
private Button wrappingBox;
/**
* Charset combo.
*/
private Combo charsetCombo;
/**
* Buffer text.
*/
private Text bufferText;
/**
* timeout text.
*/
private Text timeoutText;
/**
* Backlog rows text.
*/
private Text backlogText;
/**
* Preference tab folder.
*/
private TabFolder folder;
/**
* Color selector in appearance group.
*/
private ColorSelector cursorLineColorSelector;
/**
* Font style label.
*/
private Label fontStyleLabel;
/**
* Text foreground color selector.
*/
private ColorSelector textForegroundColorSelector;
/**
* Creates this widget witha given parent
*
* @param parent - parent.
* @param mainCompositeData - layout data.
*/
public void createControl(Composite parent, GridData mainCompositeData)
{
black = new RGB(0, 0, 0);
Label l=new Label(parent,SWT.NONE);
l.setText(Messages.LoggingPreferenceWidget_CUSTOMIZE_LABEL);
folder = new TabFolder(parent, SWT.NONE);
folder.setData(mainCompositeData);
createGeneralTab(folder);
createColoringTab(folder);
}
/**
* Activates tab.
* @param tab
*/
public void activateTab(int tab)
{
folder.setSelection(tab);
}
private void createGeneralTab(TabFolder folder)
{
TabItem generalTab = new TabItem(folder, SWT.NONE);
generalTab.setText(Messages.General_Tab_Name);
generalTab.setToolTipText(Messages.General_Tab_ToolTip);
Composite generalComposite = new Composite(folder, SWT.NONE);
generalComposite.setFont(folder.getFont());
GridLayout layout = new GridLayout();
layout.marginHeight = 8;
layout.marginWidth = 10;
generalComposite.setLayout(layout);
generalTab.setControl(generalComposite);
createAppearance(generalComposite);
createTail(generalComposite);
createAutobolding(generalComposite);
generalComposite.setFocus();
createWrapping(generalComposite);
}
private void createColoringTab(TabFolder folder)
{
TabItem coloringTab = new TabItem(folder, SWT.NONE);
coloringTab.setText(Messages.Coloring_Tab_Name);
coloringTab.setToolTipText(Messages.Coloring_Tab_ToolTip);
Color systemWidgetBGColor = getControl().getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND);
coloringComposite = new Composite(folder, SWT.NONE);
coloringComposite.setFont(folder.getFont());
GridLayout layout = new GridLayout();
layout.marginHeight = 8;
layout.marginWidth = 10;
coloringComposite.setLayout(layout);
coloringComposite.setBackground(systemWidgetBGColor);
coloringTab.setControl(coloringComposite);
createIntroduction(coloringComposite);
scrolls = new ColorizationScrolledComposite(coloringComposite);
layout = new GridLayout();
layout.numColumns = 1;
layout.makeColumnsEqualWidth = false;
layout.marginHeight = 5;
layout.marginWidth = 5;
layout.verticalSpacing = 5;
layout.horizontalSpacing = 5;
scrolls.setLayout(layout);
GridData gridData = new GridData(GridData.FILL, GridData.FILL, true, true);
scrolls.setLayoutData(gridData);
displayArea = scrolls.getBody();
layout = new GridLayout();
layout.numColumns = 1;
layout.makeColumnsEqualWidth = false;
layout.marginHeight = 0;
layout.marginWidth = 0;
layout.verticalSpacing = 10;
layout.horizontalSpacing = 0;
displayArea.setLayout(layout);
displayArea.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));
// description = new Label(displayArea, SWT.WRAP);
// description.setText(Messages.getString("LoggingColorizationWidget.28"));
styleImportExport();
//styleEditorOptions();
GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 1;
tokenExpandable = new ExpandableComposite(displayArea, SWT.NONE, ExpandableComposite.TWISTIE
| ExpandableComposite.CLIENT_INDENT);
tokenExpandable.setText(Messages.LoggingColorizationWidget_29);
tokenExpandable.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false));
tokenExpandable.setLayout(gridLayout);
tokenExpandable.setExpanded(UnifiedEditorsPlugin.getDefault().getPreferenceStore().getBoolean(
IPreferenceConstants.EXPAND_TOKENS));
tokenExpandable.addExpansionListener(new ExpansionAdapter()
{
public void expansionStateChanged(ExpansionEvent e)
{
expandedStateChanged((ExpandableComposite) e.getSource());
}
});
makeScrollableCompositeAware(tokenExpandable);
Composite inner = new Composite(tokenExpandable, SWT.NONE);
gridLayout = new GridLayout(2, false);
inner.setLayout(gridLayout);
tokenExpandable.setClient(inner);
createAddRuleButtons(inner);
tree = new Tree(inner, SWT.FULL_SELECTION | SWT.SINGLE | SWT.V_SCROLL | SWT.BORDER);
tree.setHeaderVisible(false);
tree.setLinesVisible(false);
GridData treeLayoutData = new GridData(GridData.FILL, GridData.FILL, true, true);
treeLayoutData.heightHint = tree.getItemHeight() * 16;
treeLayoutData.widthHint = 300;
tree.setLayoutData(treeLayoutData);
gridLayout = new GridLayout();
gridLayout.numColumns = 1;
tree.setLayout(gridLayout);
viewer = new TreeViewer(tree);
// viewer.setContentProvider(provider);
// viewer.setLabelProvider(provider);
viewer.setAutoExpandLevel(2);
styleCells();
// tree.addSelectionListener(new SelectionAdapter() @regions
// {
//
// private Map empty = new HashMap();
//
// public void widgetSelected(SelectionEvent e)
// {
// TreeItem[] selection = viewer.getTree().getSelection();
// if (selection == null || selection.length == 0)
// {
// return;
// }
// Object data = selection[0].getData();
// remove.setEnabled(false);
// if (data instanceof IToken)
// {
// Map regionMap = provider.getRegions((IToken) data);
// regionViewer.setInput(regionMap);
// addRegion.setEnabled(provider.getStyle((IToken) data) != null);
// }
// else
// {
// addRegion.setEnabled(false);
// regionViewer.setInput(empty);
// }
// }
//
// });
createRuleButtons(inner);
//loadRegions(); @regions
}
/**
* Creates introduction label.
* @param parent - parent.
*/
private void createIntroduction(Composite parent)
{
description = new Label(parent, SWT.LEFT | SWT.WRAP);
GridData dData = new GridData(SWT.FILL, SWT.FILL, false, false);
dData.widthHint = 400;
description.setLayoutData(dData);
description.setText(Messages.LoggingPreferenceWidget_0);
}
/**
* Creates auto-bolding.
* @param parent - parent.
*/
private void createAutobolding(Composite parent)
{
autoboldingComposite = new Composite(parent, SWT.NONE);
autoboldingComposite.setLayout(new GridLayout(2, false));
autoboldingComposite.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false));
autoboldingBox = new Button(autoboldingComposite, SWT.CHECK);
autoboldingBox.addSelectionListener(new SelectionListener()
{
public void widgetDefaultSelected(SelectionEvent e)
{
}
public void widgetSelected(SelectionEvent e)
{
if (provider != null)
{
provider.setAutoBolding(LoggingPreferenceWidget.this.autoboldingBox.getSelection());
}
}
});
Label label = new Label(autoboldingComposite, SWT.NONE);
label.setText(Messages.LoggingPreferenceWidget_Autobolding_Label);
}
/**
* Creates appearance settings.
* @param parent - parent.
*/
private void createAppearance(Composite parent)
{
final Group appearanceGroup = new Group(parent, SWT.NONE);
appearanceGroup.setLayout(new GridLayout(3, false));
appearanceGroup.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false));
appearanceGroup.setText(Messages.LoggingPreferenceWidget_1);
Label label = new Label(appearanceGroup, SWT.NONE);
label.setText(Messages.LoggingPreferenceWidget_CursorLineColor_Label);
cursorLineColorSelector = new ColorSelector(appearanceGroup);
cursorLineColorSelector.getButton().setLayoutData(new GridData(SWT.LEFT, GridData.CENTER, false, false, 2, 1));
cursorLineColorSelector.setEnabled(true);
cursorLineColorSelector.addListener(new IPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
RGB newRGB = (RGB) event.getNewValue();
if (!newRGB.equals(event.getOldValue())) {
provider.setCursorLineColor(newRGB);
}
cursorLineColorSelector.setColorValue(newRGB);
}
});
label = new Label(appearanceGroup, SWT.NONE);
label.setText(Messages.LoggingPreferenceWidget_TextForegroundColor_Label);
textForegroundColorSelector = new ColorSelector(appearanceGroup);
textForegroundColorSelector.getButton().setLayoutData(new GridData(SWT.LEFT, GridData.CENTER, false, false, 2, 1));
textForegroundColorSelector.setEnabled(true);
textForegroundColorSelector.addListener(new IPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
RGB newRGB = (RGB) event.getNewValue();
if (!newRGB.equals(event.getOldValue())) {
provider.setTextForegroundColor(newRGB);
}
textForegroundColorSelector.setColorValue(newRGB);
}
});
label = new Label(appearanceGroup, SWT.LEFT | SWT.CENTER);
label.setText(Messages.LoggingPreferenceWidget_Font_Label);
label.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, false, false));
fontStyleLabel = new Label(appearanceGroup, SWT.LEFT | SWT.CENTER);
fontStyleLabel.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, false, false));
final Button fontButton = new Button(appearanceGroup, SWT.NONE);
fontButton.addSelectionListener(new SelectionListener()
{
public void widgetDefaultSelected(SelectionEvent e)
{
}
public void widgetSelected(SelectionEvent e)
{
if (provider != null)
{
FontDialog dialog = new FontDialog(fontButton.getShell());
dialog.setFontList(getPreferences().getFontData());
if(dialog.open() != null)
{
FontData[] font = dialog.getFontList();
provider.setFont(font);
if (font != null && font.length > 0)
{
String fontStr = font[0].getName() + "-" + font[0].getHeight(); //$NON-NLS-1$
fontStyleLabel.setText(fontStr);
appearanceGroup.layout(true, true);
}
}
}
}
});
fontButton.setLayoutData(new GridData(GridData.CENTER, GridData.CENTER, false, false));
fontButton.setText(Messages.LoggingPreferenceWidget_4);
final Label charsetLabel = new Label(appearanceGroup, SWT.LEFT | SWT.CENTER);
charsetLabel.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, false, false));
charsetLabel.setText(Messages.LoggingPreferenceWidget_5);
charsetCombo = new Combo(appearanceGroup, SWT.LEFT | SWT.CENTER | SWT.READ_ONLY);
charsetCombo.setLayoutData(new GridData(SWT.LEFT, GridData.CENTER, false, false, 2, 1));
Collection<String> charsets = Charset.availableCharsets().keySet();
String[] items = new String[charsets.size()];
charsets.toArray(items);
charsetCombo.setItems(items);
charsetCombo.addSelectionListener(new SelectionListener()
{
public void widgetDefaultSelected(SelectionEvent e)
{
}
public void widgetSelected(SelectionEvent e)
{
if (provider != null)
{
String selected = charsetCombo.getItem(charsetCombo.getSelectionIndex());
provider.setDefaultEncoding(selected);
}
}
});
}
/**
* Creates appearance settings.
* @param parent - parent.
*/
private void createTail(Composite parent)
{
Group tailGroup = new Group(parent, SWT.NONE);
tailGroup.setLayout(new GridLayout(2, false));
tailGroup.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false));
tailGroup.setText(Messages.LoggingPreferenceWidget_6);
Label label = new Label(tailGroup, SWT.LEFT);
label.setText(Messages.LoggingPreferenceWidget_7);
label.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, false, false));
timeoutText = new Text(tailGroup, SWT.LEFT | SWT.BORDER);
timeoutText.addModifyListener(new ModifyListener()
{
public void modifyText(ModifyEvent e)
{
String contentText = timeoutText.getText();
try
{
int val = Integer.parseInt(contentText);
if (val < MIN_READ_TIMEOUT)
{
if (errorHandler != null)
{
errorHandler.setErrorMessage(Messages.LoggingPreferenceWidget_8 + MIN_READ_TIMEOUT);
}
}
if (errorHandler != null)
{
errorHandler.setErrorMessage(null);
}
provider.setReadTimeout(val);
}
catch (NumberFormatException ex)
{
errorHandler.setErrorMessage(Messages.LoggingPreferenceWidget_9);
return;
}
}
});
timeoutText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
label = new Label(tailGroup, SWT.LEFT);
label.setText(Messages.LoggingPreferenceWidget_10);
label.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, false, false));
bufferText = new Text(tailGroup, SWT.LEFT | SWT.BORDER);
bufferText.addModifyListener(new ModifyListener()
{
public void modifyText(ModifyEvent e)
{
String contentText = bufferText.getText();
try
{
int val = Integer.parseInt(contentText);
if (val <= 0)
{
if (errorHandler != null)
{
errorHandler.setErrorMessage(Messages.LoggingPreferenceWidget_11);
}
}
if (errorHandler != null)
{
errorHandler.setErrorMessage(null);
}
provider.setReadBuffer(val);
}
catch (NumberFormatException ex)
{
errorHandler.setErrorMessage(Messages.LoggingPreferenceWidget_12);
return;
}
}
});
bufferText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
label = new Label(tailGroup, SWT.LEFT);
label.setText(Messages.LoggingPreferenceWidget_13);
label.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, false, false));
backlogText = new Text(tailGroup, SWT.LEFT | SWT.BORDER);
backlogText.addModifyListener(new ModifyListener()
{
public void modifyText(ModifyEvent e)
{
String contentText = backlogText.getText();
try
{
int val = Integer.parseInt(contentText);
if (val <= 0)
{
if (errorHandler != null)
{
errorHandler.setErrorMessage(Messages.LoggingPreferenceWidget_14);
}
}
if (errorHandler != null)
{
errorHandler.setErrorMessage(null);
}
provider.setBacklogLines(val);
}
catch (NumberFormatException ex)
{
errorHandler.setErrorMessage(Messages.LoggingPreferenceWidget_15);
return;
}
}
});
backlogText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
}
/**
* Creates wrapping composite.
* @param parent - parent.
*/
private void createWrapping(Composite parent)
{
Composite wrappingComposite = new Composite(parent, SWT.NONE);
wrappingComposite.setLayout(new GridLayout(2, false));
wrappingComposite.setLayoutData(new GridData(GridData.FILL, GridData.FILL, false, false));
wrappingBox = new Button(wrappingComposite, SWT.CHECK);
wrappingBox.addSelectionListener(new SelectionListener()
{
public void widgetDefaultSelected(SelectionEvent e)
{
}
public void widgetSelected(SelectionEvent e)
{
if (provider != null)
{
provider.setWrapping(wrappingBox.getSelection());
}
}
});
Label label = new Label(wrappingComposite, SWT.NONE);
label.setText(Messages.LoggingPreferenceWidget_Wrapping_Label);
}
/**
* Creates "Add rule" buttons.
* @param parent - parent.
*/
private void createAddRuleButtons(Composite parent)
{
Composite buttonsComposite = new Composite(parent, SWT.NONE);
buttonsComposite.setLayout(new GridLayout(3, false));
buttonsComposite.setLayoutData(new GridData(GridData.FILL, GridData.FILL, false, false, 2, 1));
addStringRuleButton = new Button(buttonsComposite, SWT.NONE);
addStringRuleButton.setLayoutData(new GridData(GridData.FILL, GridData.FILL, false, false));
addStringRuleButton.setToolTipText(Messages.LoggingColorizationWidget_30);
addStringRuleButton.setImage(SWTUtils.getImage(CoreUIPlugin.getDefault(), "/icons/add.gif")); //$NON-NLS-1$
addStringRuleButton.addSelectionListener(new SelectionListener()
{
public void widgetDefaultSelected(SelectionEvent e)
{
}
public void widgetSelected(SelectionEvent e)
{
addRule();
}
});
editRuleButton = new Button(buttonsComposite, SWT.NONE);
editRuleButton.setLayoutData(new GridData(GridData.FILL, GridData.FILL, false, false));
editRuleButton.setToolTipText(Messages.LoggingColorizationWidget_32);
editRuleButton.setImage(SWTUtils.getImage(CoreUIPlugin.getDefault(), "/icons/edit.png")); //$NON-NLS-1$
editRuleButton.addSelectionListener(new SelectionListener()
{
public void widgetDefaultSelected(SelectionEvent e)
{
}
public void widgetSelected(SelectionEvent e)
{
editRule();
}
});
removeRuleButton = new Button(buttonsComposite, SWT.NONE);
removeRuleButton.setLayoutData(new GridData(GridData.FILL, GridData.FILL, false, false));
removeRuleButton.setToolTipText(Messages.LoggingColorizationWidget_31);
removeRuleButton.setImage(SWTUtils.getImage(CoreUIPlugin.getDefault(), "/icons/delete.gif")); //$NON-NLS-1$
removeRuleButton.addSelectionListener(new SelectionListener()
{
public void widgetDefaultSelected(SelectionEvent e)
{
}
public void widgetSelected(SelectionEvent e)
{
removeRule();
}
});
// addRegexpRuleButton = new Button(buttonsComposite, SWT.NONE);
// addRegexpRuleButton.setLayoutData(new GridData(GridData.FILL, GridData.FILL, false, false));
// addRegexpRuleButton.setText(Messages.getString("LoggingColorizationWidget.addRegexpRuleButton.text"));
// addRegexpRuleButton.addSelectionListener(new SelectionListener()
// {
// public void widgetDefaultSelected(SelectionEvent e)
// {
// }
//
// public void widgetSelected(SelectionEvent e)
// {
// addRule(true);
// }
//
// });
}
/**
* Creates rule buttons.
* @param parent - parent.
*/
private void createRuleButtons(Composite parent)
{
Composite buttonsComposite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(1, false);
buttonsComposite.setLayout(layout);
buttonsComposite.setLayoutData(new GridData(GridData.FILL, GridData.FILL, false, false));
upRuleButton = new Button(buttonsComposite, SWT.NONE);
upRuleButton.setLayoutData(new GridData(GridData.FILL, GridData.FILL, false, false));
upRuleButton.setToolTipText(Messages.LoggingColorizationWidget_UpRuleButton);
upRuleButton.setImage(SWTUtils.getImage(LoggingPlugin.getDefault(), "/icons/upward_nav_on.gif")); //$NON-NLS-1$
upRuleButton.addSelectionListener(new SelectionListener()
{
public void widgetDefaultSelected(SelectionEvent e)
{
}
public void widgetSelected(SelectionEvent e)
{
moveRuleUp();
}
});
downRuleButton = new Button(buttonsComposite, SWT.NONE);
downRuleButton.setLayoutData(new GridData(GridData.FILL, GridData.FILL, false, false));
downRuleButton.setToolTipText(Messages.LoggingColorizationWidget_DownRuleButton);
downRuleButton.setImage(SWTUtils.getImage(LoggingPlugin.getDefault(), "/icons/downward_nav_on.gif")); //$NON-NLS-1$
downRuleButton.addSelectionListener(new SelectionListener()
{
public void widgetDefaultSelected(SelectionEvent e)
{
}
public void widgetSelected(SelectionEvent e)
{
moveRuleDown();
}
});
}
/**
* Gets the control for this widget
*
* @return - main widget
*/
public Control getControl()
{
// return coloringComposite;
return folder;
}
private void loadEditorOptions()
{
}
private void makeScrollableCompositeAware(Control control)
{
ColorizationScrolledComposite parentScrolledComposite = getParentScrolledComposite(control);
if (parentScrolledComposite != null)
{
parentScrolledComposite.adaptChild(control);
}
}
private void expandedStateChanged(ExpandableComposite expandable)
{
ColorizationScrolledComposite parentScrolledComposite = getParentScrolledComposite(expandable);
if (parentScrolledComposite != null)
{
parentScrolledComposite.reflow(true);
}
}
private ColorizationScrolledComposite getParentScrolledComposite(Control control)
{
Control parent = control.getParent();
while (!(parent instanceof ColorizationScrolledComposite) && parent != null)
{
parent = parent.getParent();
}
if (parent instanceof ColorizationScrolledComposite)
{
return (ColorizationScrolledComposite) parent;
}
return null;
}
private void styleEditorOptions()
{
GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 1;
editorExpandable = new ExpandableComposite(displayArea, SWT.NONE, ExpandableComposite.TWISTIE
| ExpandableComposite.CLIENT_INDENT);
editorExpandable.setText(Messages.LoggingColorizationWidget_33);
editorExpandable.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false));
editorExpandable.setLayout(gridLayout);
editorExpandable.setExpanded(UnifiedEditorsPlugin.getDefault().getPreferenceStore().getBoolean(
IPreferenceConstants.EXPAND_EDITOR_OPTIONS));
editorExpandable.addExpansionListener(new ExpansionAdapter()
{
public void expansionStateChanged(ExpansionEvent e)
{
expandedStateChanged((ExpandableComposite) e.getSource());
}
});
makeScrollableCompositeAware(editorExpandable);
Composite inner = new Composite(editorExpandable, SWT.NONE);
inner.setLayout(gridLayout);
editorExpandable.setClient(inner);
override = new Button(inner, SWT.CHECK);
override.setEnabled(false);
override.setText(Messages.LoggingColorizationWidget_34);
override.addSelectionListener(new SelectionAdapter()
{
public void widgetSelected(SelectionEvent e)
{
boolean isSelected = override.getSelection();
if (isSelected)
{
Color blackColor = UnifiedColorManager.getInstance().getColor(black);
Color grayColor = UnifiedColorManager.getInstance().getColor(new RGB(139, 139, 139));
IPreferenceStore store = EditorsPlugin.getDefault().getPreferenceStore();
RGB background = PreferenceConverter
.getColor(store, AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND);
RGB lineHighlight = PreferenceConverter.getColor(store,
AbstractDecoratedTextEditorPreferenceConstants.EDITOR_CURRENT_LINE_COLOR);
RGB selectionFg = getControl().getDisplay().getSystemColor(SWT.COLOR_LIST_SELECTION_TEXT).getRGB();
RGB selectionBg = getControl().getDisplay().getSystemColor(SWT.COLOR_LIST_SELECTION).getRGB();
Color eclipseBackgroundColor = UnifiedColorManager.getInstance().getColor(background);
Color eclipseLineHighlightColor = UnifiedColorManager.getInstance().getColor(lineHighlight);
Color eclipseSelectionFgColor = UnifiedColorManager.getInstance().getColor(selectionFg);
Color eclipseSelectionBgColor = UnifiedColorManager.getInstance().getColor(selectionBg);
Color systemWidgetBGColor = getControl().getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND);
provider.setBackgroundColor(eclipseBackgroundColor);
provider.setCaretColor(blackColor);
provider.setLineHighlightColor(eclipseLineHighlightColor);
provider.setSelectionForegroundColor(eclipseSelectionFgColor);
provider.setSelectionBackgroundColor(eclipseSelectionBgColor);
provider.setFoldingBackgroundColor(systemWidgetBGColor);
provider.setFoldingForegroundColor(grayColor);
backgroundSelector.setColorValue(provider.getBackgroundColor().getRGB());
lineHighlightSelector.setColorValue(provider.getLineHighlightColor().getRGB());
selectionForegroundSelector.setColorValue(provider.getSelectionForegroundColor().getRGB());
selectionBackgroundSelector.setColorValue(provider.getSelectionBackgroundColor().getRGB());
foldingBackgroundSelector.setColorValue(provider.getFoldingBackgroundColor().getRGB());
foldingForegroundSelector.setColorValue(provider.getFoldingForegroundColor().getRGB());
caretSelector.setColorValue(provider.getCaretColor().getRGB());
}
else
{
provider.setBackgroundColor(null);
provider.setCaretColor(null);
provider.setLineHighlightColor(null);
provider.setSelectionForegroundColor(null);
provider.setSelectionBackgroundColor(null);
provider.setFoldingBackgroundColor(null);
provider.setFoldingForegroundColor(null);
}
backgroundSelector.setEnabled(isSelected);
lineHighlightSelector.setEnabled(isSelected);
selectionForegroundSelector.setEnabled(isSelected);
selectionBackgroundSelector.setEnabled(isSelected);
foldingBackgroundSelector.setEnabled(isSelected);
foldingForegroundSelector.setEnabled(isSelected);
caretSelector.setEnabled(isSelected);
}
});
Composite buttons = new Composite(inner, SWT.NONE);
gridLayout = new GridLayout();
gridLayout.numColumns = 2;
gridLayout.horizontalSpacing = 0;
gridLayout.verticalSpacing = 0;
gridLayout.marginRight = 0;
gridLayout.marginLeft = 0;
gridLayout.makeColumnsEqualWidth = true;
buttons.setLayout(gridLayout);
buttons.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));
gridLayout = new GridLayout();
gridLayout.numColumns = 2;
gridLayout.marginRight = 0;
gridLayout.marginLeft = 0;
gridLayout.horizontalSpacing = 5;
gridLayout.verticalSpacing = 0;
gridLayout.makeColumnsEqualWidth = false;
Composite bgComp = new Composite(buttons, SWT.NONE);
bgComp.setLayout(gridLayout);
bgComp.setLayoutData(new GridData(SWT.RIGHT, GridData.FILL, true, true));
Label bgLabel = new Label(bgComp, SWT.RIGHT);
bgLabel.setText(Messages.LoggingColorizationWidget_35);
backgroundSelector = new ColorSelector(bgComp);
backgroundSelector.addListener(new IPropertyChangeListener()
{
public void propertyChange(PropertyChangeEvent event)
{
provider.setBackgroundColor(UnifiedColorManager.getInstance().getColor((RGB) event.getNewValue()));
}
});
Composite lComp = new Composite(buttons, SWT.NONE);
lComp.setLayoutData(new GridData(SWT.RIGHT, GridData.FILL, true, true));
lComp.setLayout(gridLayout);
Label lLabel = new Label(lComp, SWT.RIGHT);
lLabel.setText(Messages.LoggingColorizationWidget_36);
lineHighlightSelector = new ColorSelector(lComp);
lineHighlightSelector.addListener(new IPropertyChangeListener()
{
public void propertyChange(PropertyChangeEvent event)
{
provider.setLineHighlightColor(UnifiedColorManager.getInstance().getColor((RGB) event.getNewValue()));
}
});
Composite sfComp = new Composite(buttons, SWT.NONE);
sfComp.setLayoutData(new GridData(SWT.RIGHT, GridData.FILL, true, true));
sfComp.setLayout(gridLayout);
Label sfLabel = new Label(sfComp, SWT.RIGHT);
sfLabel.setText(Messages.LoggingColorizationWidget_37);
selectionForegroundSelector = new ColorSelector(sfComp);
selectionForegroundSelector.addListener(new IPropertyChangeListener()
{
public void propertyChange(PropertyChangeEvent event)
{
provider.setSelectionForegroundColor(UnifiedColorManager.getInstance().getColor(
(RGB) event.getNewValue()));
}
});
Composite sbComp = new Composite(buttons, SWT.NONE);
sbComp.setLayoutData(new GridData(SWT.RIGHT, GridData.FILL, true, true));
sbComp.setLayout(gridLayout);
Label sbLabel = new Label(sbComp, SWT.RIGHT);
sbLabel.setText(Messages.LoggingColorizationWidget_38);
selectionBackgroundSelector = new ColorSelector(sbComp);
selectionBackgroundSelector.addListener(new IPropertyChangeListener()
{
public void propertyChange(PropertyChangeEvent event)
{
provider.setSelectionBackgroundColor(UnifiedColorManager.getInstance().getColor(
(RGB) event.getNewValue()));
}
});
Composite fbgComp = new Composite(buttons, SWT.NONE);
fbgComp.setLayoutData(new GridData(SWT.RIGHT, GridData.FILL, true, true));
fbgComp.setLayout(gridLayout);
Label fbgLabel = new Label(fbgComp, SWT.RIGHT);
fbgLabel.setText(Messages.LoggingColorizationWidget_39);
foldingBackgroundSelector = new ColorSelector(fbgComp);
foldingBackgroundSelector.addListener(new IPropertyChangeListener()
{
public void propertyChange(PropertyChangeEvent event)
{
provider.setFoldingBackgroundColor(UnifiedColorManager.getInstance()
.getColor((RGB) event.getNewValue()));
}
});
Composite ffgComp = new Composite(buttons, SWT.NONE);
ffgComp.setLayoutData(new GridData(SWT.RIGHT, GridData.FILL, true, true));
ffgComp.setLayout(gridLayout);
Label ffgLabel = new Label(ffgComp, SWT.RIGHT);
ffgLabel.setText(Messages.LoggingColorizationWidget_40);
foldingForegroundSelector = new ColorSelector(ffgComp);
foldingForegroundSelector.addListener(new IPropertyChangeListener()
{
public void propertyChange(PropertyChangeEvent event)
{
provider.setFoldingForegroundColor(UnifiedColorManager.getInstance()
.getColor((RGB) event.getNewValue()));
}
});
Composite cComp = new Composite(buttons, SWT.NONE);
cComp.setLayoutData(new GridData(SWT.RIGHT, GridData.FILL, true, true));
cComp.setLayout(gridLayout);
Label cLabel = new Label(cComp, SWT.RIGHT);
cLabel.setText(Messages.LoggingColorizationWidget_41);
caretSelector = new ColorSelector(cComp);
caretSelector.addListener(new IPropertyChangeListener()
{
public void propertyChange(PropertyChangeEvent event)
{
provider.setCaretColor(UnifiedColorManager.getInstance().getColor((RGB) event.getNewValue()));
}
});
// Hide caret color option on Mac OS X since it causes cursor lag
if (Platform.getOS().equals(Platform.OS_MACOSX))
{
cComp.setVisible(false);
}
loadEditorOptions();
if (provider != null)
{
viewer.setContentProvider(provider);
viewer.setLabelProvider(provider);
initializeColorizerView();
}
}
private void styleCells()
{
CheckboxCellEditor editor = new CheckboxCellEditor(tree);
ColorCellEditor colorEditor = new ColorCellEditor(tree);
CellEditor[] editors = new CellEditor[COLUMNS.length];
editors[0] = editor;
editors[1] = null;
editors[2] = null;
editors[3] = colorEditor;
editors[4] = editor;
editors[5] = editors[4];
editors[6] = editors[5];
ICellModifier modifier = new ICellModifier()
{
public void modify(Object element, String property, Object value)
{
if (element instanceof Item)
{
element = ((Item) element).getData();
}
ColorizationStyle style = null;
if (element instanceof IToken)
{
style = provider.getStyle((IToken) element);
}
else if (element instanceof Category)
{
style = ((Category) element).getStyle();
}
if (style != null)
{
if (value instanceof Boolean)
{
Boolean bool = (Boolean) value;
if (element instanceof IToken && property == COLUMNS[0])
{
provider.removeStyle((IToken) element);
//regionViewer.refresh(); @regions
}
else if (property == COLUMNS[4])
{
style.setBold(bool.booleanValue());
}
else if (property == COLUMNS[5])
{
style.setItalic(bool.booleanValue());
}
else if (property == COLUMNS[6])
{
style.setUnderline(bool.booleanValue());
}
}
else if (value instanceof RGB)
{
RGB rgb = (RGB) value;
if (property == COLUMNS[3])
{
style.setForegroundColor(UnifiedColorManager.getInstance().getColor(rgb));
}
}
}
else
{
// if (element instanceof IToken && value instanceof Boolean && property == COLUMNS[1])
// {
// Boolean bool = (Boolean) value;
// if (bool.booleanValue())
// {
// IToken token = (IToken) element;
// style = new ColorizationStyle();
// style.setForegroundColor(UnifiedColorManager.getInstance().getColor(black));
// style.setName(token.getCategory() + "_" + token.getType());
// provider.addStyle((IToken) element, style);
// }
// }
}
viewer.update(element, null);
}
public Object getValue(Object element, String property)
{
ColorizationStyle style = null;
if (element instanceof IToken)
{
style = provider.getStyle((IToken) element);
}
else if (element instanceof Category)
{
style = ((Category) element).getStyle();
}
if (style != null)
{
if (property == COLUMNS[0])
{
return Boolean.valueOf(true);
}
else if (property == COLUMNS[3])
{
return style.getForegroundColor().getRGB();
}
else if (property == COLUMNS[4])
{
return Boolean.valueOf(style.isBold());
}
else if (property == COLUMNS[5])
{
return Boolean.valueOf(style.isItalic());
}
else if (property == COLUMNS[6])
{
return Boolean.valueOf(style.isUnderline());
}
}
else if (property == COLUMNS[0])
{
return Boolean.valueOf(false);
}
return null;
}
public boolean canModify(Object element, String property)
{
boolean canModify = false;
ColorizationStyle style = null;
if (element instanceof IToken)
{
style = provider.getStyle((IToken) element);
if (property == COLUMNS[0])
{
canModify = true;
}
}
else if (element instanceof Category)
{
style = ((Category) element).getStyle();
}
if (style != null)
{
canModify = true;
}
return canModify;
}
};
// final TreeColumn column0 = new TreeColumn(tree, SWT.LEFT);
// column0.setWidth(100);
// column0.setText(COLUMNS[0]);
final TreeColumn column1 = new TreeColumn(tree, SWT.LEFT);
column1.setWidth(ICON_COLUMN_WIDTH);
column1.setText(COLUMNS[0]);
final TreeColumn column2 = new TreeColumn(tree, SWT.LEFT);
column2.setWidth(125);
column2.setText(COLUMNS[1]);
final TreeColumn column3 = new TreeColumn(tree, SWT.CENTER);
column3.setWidth(ICON_COLUMN_WIDTH);
column3.setText(COLUMNS[2]);
column3.pack();
final TreeColumn column4 = new TreeColumn(tree, SWT.CENTER);
column4.setWidth(ICON_COLUMN_WIDTH);
column4.setText(COLUMNS[3]);
column4.pack();
final TreeColumn column5 = new TreeColumn(tree, SWT.CENTER);
column5.setWidth(ICON_COLUMN_WIDTH);
column5.setText(COLUMNS[4]);
column5.pack();
final TreeColumn column6 = new TreeColumn(tree, SWT.CENTER);
column6.setWidth(ICON_COLUMN_WIDTH);
column6.setText(COLUMNS[5]);
column6.pack();
final TreeColumn column7 = new TreeColumn(tree, SWT.CENTER);
column7.setWidth(ICON_COLUMN_WIDTH);
column7.setText(COLUMNS[6]);
column7.pack();
viewer.setColumnProperties(COLUMNS);
viewer.setCellEditors(editors);
viewer.setCellModifier(modifier);
}
/**
* Sets the error handler for this widget
*
* @param handler
*/
public void setErrorHandler(IErrorHandler handler)
{
this.errorHandler = handler;
}
// private TextCellEditor createRegionNameEditor() @regions
// {
// TextCellEditor nameEditor = new TextCellEditor(table);
// nameEditor.setValidator(new ICellEditorValidator()
// {
//
// public String isValid(Object value)
// {
// IToken token = (IToken) viewer.getTree().getSelection()[0].getData();
// Region region = (Region) table.getSelection()[0].getData();
// String text = (String) value;
// if (!region.getName().equals(text) && regionNameExists(text, token))
// {
// String message = Messages.LoggingColorizationWidget_42;
// if (errorHandler != null)
// {
// errorHandler.setErrorMessage(message);
// }
// return message;
// }
// else
// {
// if (errorHandler != null)
// {
// errorHandler.setErrorMessage(null);
// }
// }
// return null;
// }
//
// });
// return nameEditor;
// }
// private TextCellEditor createRegionOffsetEditor() @regions
// {
// TextCellEditor offsetEditor = new TextCellEditor(table);
// offsetEditor.setValidator(new ICellEditorValidator()
// {
//
// public String isValid(Object value)
// {
// String text = (String) value;
// Region region = (Region) table.getSelection()[0].getData();
// if (region != null)
// {
// try
// {
// if (text.startsWith(ColorizationConstants.LENGTH_KEYWORD))
// {
// String number = text.substring(ColorizationConstants.LENGTH_KEYWORD.length(), text.length());
// number = number.trim();
// if (number.length() > 1 && number.charAt(0) == '-')
// {
// Integer.parseInt(number);
// }
// else
// {
// throw new Exception();
// }
// }
// else
// {
// Integer.parseInt(text);
// }
// if (errorHandler != null)
// {
// errorHandler.setErrorMessage(null);
// }
// }
// catch (Exception e1)
// {
// String message = Messages.LoggingColorizationWidget_43 + region.getName() + Messages.LoggingColorizationWidget_44;
// if (errorHandler != null)
// {
// errorHandler.setErrorMessage(message);
// }
// return message;
// }
// }
// return null;
// }
//
// });
// return offsetEditor;
// }
// private TextCellEditor createRegionLengthEditor() @regions
// {
// TextCellEditor lengthEditor = new TextCellEditor(table);
// lengthEditor.setValidator(new ICellEditorValidator()
// {
//
// public String isValid(Object value)
// {
// String text = (String) value;
// Region region = (Region) table.getSelection()[0].getData();
// if (region != null)
// {
// try
// {
// if (text.startsWith(ColorizationConstants.LENGTH_KEYWORD))
// {
// String number = text.substring(ColorizationConstants.LENGTH_KEYWORD.length(), text.length());
// number = number.trim();
// if (number.length() > 1 && number.charAt(0) == '-')
// {
// Integer.parseInt(number);
// }
// else
// {
// throw new Exception();
// }
// }
// else
// {
// Integer.parseInt(text);
// }
// if (errorHandler != null)
// {
// errorHandler.setErrorMessage(null);
// }
// }
// catch (Exception e1)
// {
// String message = Messages.LoggingColorizationWidget_45 + region.getName() + Messages.LoggingColorizationWidget_46;
// if (errorHandler != null)
// {
// errorHandler.setErrorMessage(message);
// }
// return message;
// }
// }
// return null;
// }
//
// });
// return lengthEditor;
// }
// private void loadRegions() @regions
// {
// GridLayout gridLayout = new GridLayout();
// gridLayout.numColumns = 1;
//
// regionExpandable = new ExpandableComposite(displayArea, SWT.NONE, ExpandableComposite.TWISTIE
// | ExpandableComposite.CLIENT_INDENT);
// regionExpandable.setText(Messages.LoggingColorizationWidget_47);
// regionExpandable.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false));
// regionExpandable.setLayout(gridLayout);
// regionExpandable.setExpanded(UnifiedEditorsPlugin.getDefault().getPreferenceStore().getBoolean(
// IPreferenceConstants.EXPAND_REGIONS));
// regionExpandable.addExpansionListener(new ExpansionAdapter()
// {
// public void expansionStateChanged(ExpansionEvent e)
// {
// expandedStateChanged((ExpandableComposite) e.getSource());
// }
// });
// makeScrollableCompositeAware(regionExpandable);
// Composite inner = new Composite(regionExpandable, SWT.NONE);
// inner.setLayout(gridLayout);
// regionExpandable.setClient(inner);
// Composite addRemove = new Composite(inner, SWT.NONE);
// GridLayout layout = new GridLayout();
// layout.numColumns = 2;
// layout.makeColumnsEqualWidth = false;
// layout.marginHeight = 5;
// layout.marginWidth = 0;
// layout.verticalSpacing = 5;
// layout.horizontalSpacing = 5;
// addRemove.setLayout(layout);
// addRemove.setLayoutData(new GridData(GridData.FILL, GridData.FILL, false, false));
//
// addRegion = new Button(addRemove, SWT.PUSH);
// addRegion.setText(StringUtils.ellipsify(Messages.LoggingColorizationWidget_48));
// addRegion.setEnabled(false);
// remove = new Button(addRemove, SWT.PUSH);
// remove.setText(Messages.LoggingColorizationWidget_49);
// remove.setEnabled(false);
// Label formatLabel = new Label(inner, SWT.WRAP);
// formatLabel
// .setText(Messages.LoggingColorizationWidget_50);
// formatLabel.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false));
// table = new Table(inner, SWT.FULL_SELECTION | SWT.SINGLE | SWT.BORDER);
// regionViewer = new TableViewer(table);
// table.addSelectionListener(new SelectionAdapter()
// {
//
// public void widgetSelected(SelectionEvent e)
// {
// remove.setEnabled(true);
// }
//
// });
// GridData tableLayoutData = new GridData(GridData.FILL, GridData.FILL, true, true);
// tableLayoutData.heightHint = tree.getItemHeight() * 10;
// tableLayoutData.widthHint = 300;
// table.setLayoutData(tableLayoutData);
// CheckboxCellEditor editor = new CheckboxCellEditor(table);
// TextCellEditor nameEditor = createRegionNameEditor();
// TextCellEditor offsetEditor = createRegionOffsetEditor();
// TextCellEditor lengthEditor = createRegionLengthEditor();
// CellEditor[] editors = new CellEditor[REGION_COLUMNS.length];
// ColorCellEditor colorEditor = new ColorCellEditor(table);
// editors[0] = nameEditor;
// editors[1] = offsetEditor;
// editors[2] = lengthEditor;
// editors[3] = colorEditor;
// editors[4] = editor;
// editors[5] = editor;
// editors[6] = editor;
//
// TableColumn column = new TableColumn(table, SWT.LEFT);
// column.setWidth(125);
// column.setText(REGION_TABLE_COLUMNS[0]);
// column.addSelectionListener(new SelectionAdapter()
// {
//
// public void widgetSelected(SelectionEvent e)
// {
// regionViewer.setSorter(new RegionSorter(RegionSorter.NAME));
// }
//
// });
//
// column = new TableColumn(table, SWT.LEFT);
// column.setWidth(75);
// column.setText(REGION_TABLE_COLUMNS[1]);
// column.addSelectionListener(new SelectionAdapter()
// {
//
// public void widgetSelected(SelectionEvent e)
// {
// regionViewer.setSorter(new RegionSorter(RegionSorter.OFFSET));
// }
//
// });
//
// column = new TableColumn(table, SWT.LEFT);
// column.setWidth(75);
// column.setText(REGION_TABLE_COLUMNS[2]);
// column.addSelectionListener(new SelectionAdapter()
// {
//
// public void widgetSelected(SelectionEvent e)
// {
// regionViewer.setSorter(new RegionSorter(RegionSorter.LENGTH));
// }
//
// });
//
// column = new TableColumn(table, SWT.CENTER);
// column.setWidth(ICON_COLUMN_WIDTH);
// column.setText(REGION_TABLE_COLUMNS[3]);
//
// column = new TableColumn(table, SWT.CENTER);
// column.setWidth(ICON_COLUMN_WIDTH);
// column.setText(REGION_TABLE_COLUMNS[4]);
//
// column = new TableColumn(table, SWT.CENTER);
// column.setWidth(ICON_COLUMN_WIDTH);
// column.setText(REGION_TABLE_COLUMNS[5]);
//
// column = new TableColumn(table, SWT.CENTER);
// column.setWidth(ICON_COLUMN_WIDTH);
// column.setText(REGION_TABLE_COLUMNS[6]);
//
// regionViewer.setSorter(new RegionSorter(RegionSorter.OFFSET));
// table.setSortColumn(table.getColumn(1));
// table.setHeaderVisible(true);
// table.setLinesVisible(false);
//
// regionViewer.setColumnProperties(REGION_COLUMNS);
// regionViewer.setCellEditors(editors);
// regionViewer.setContentProvider(regionContentProvider);
// regionViewer.setLabelProvider(regionLabelProvider);
// regionViewer.setCellModifier(regionModifier);
// PreferenceUtils.persist(UnifiedEditorsPlugin.getDefault().getPreferenceStore(), regionViewer.getTable(),
// Messages.LoggingColorizationWidget_51);
// addRegionButtonListeners();
// }
private boolean regionNameExists(String newName, IToken token)
{
Map regions = provider.getRegions(token);
Iterator iter = regions.values().iterator();
while (iter.hasNext())
{
String name = ((Region) iter.next()).getName();
if (name.equals(newName))
{
return true;
}
}
return false;
}
// private void addRegionButtonListeners() @regions
// {
// remove.addSelectionListener(new SelectionAdapter()
// {
//
// public void widgetSelected(SelectionEvent e)
// {
// IToken token = (IToken) viewer.getTree().getSelection()[0].getData();
// Region region = (Region) table.getSelection()[0].getData();
// provider.removeRegion(token, region.getName());
// regionViewer.setInput(provider.getRegions(token));
// remove.setEnabled(false);
// viewer.update(token, null);
// }
//
// });
// addRegion.addSelectionListener(new SelectionAdapter()
// {
//
// public void widgetSelected(SelectionEvent e)
// {
// final IToken token = (IToken) viewer.getTree().getSelection()[0].getData();
// InputDialog name = new InputDialog(addRegion.getShell(), Messages.LoggingColorizationWidget_52,
// Messages.LoggingColorizationWidget_53, token
// .getType()
// + Messages.LoggingColorizationWidget_54, new IInputValidator()
// {
//
// public String isValid(String newText)
// {
// if (regionNameExists(newText, token))
// {
// return Messages.LoggingColorizationWidget_55;
// }
// else
// {
// return null;
// }
// }
//
// });
// name.setBlockOnOpen(true);
// int rc = name.open();
// if (rc == InputDialog.OK)
// {
// ColorizationStyle style = new ColorizationStyle();
// style.setName(token.getCategory() + "_" + token.getType() + "_" + name.getValue()); //$NON-NLS-2$
// style.setForegroundColor(UnifiedColorManager.getInstance().getColor(black));
// Region region = new Region(0, false, 1, false, style);
// region.setName(name.getValue());
// region.setLengthString("1");
// region.setOffsetString("0");
// Map regionMap = (Map) provider.getRegions(token);
// regionMap.put(region.getName(), region);
// regionViewer.setInput(regionMap);
// viewer.update(token, null);
// }
// }
// });
// }
// /**
// * Collapses all expandable regions
// */
// public void collapseAll() @regions
// {
// if (regionExpandable != null && tokenExpandable != null && editorExpandable != null)
// {
// regionExpandable.setExpanded(false);
// tokenExpandable.setExpanded(false);
// editorExpandable.setExpanded(false);
// }
// }
/**
* Initializes view after colorization loading.
*/
private void initializeColorizerView()
{
if (override != null) override.setEnabled(provider != null);
importButton.setEnabled(provider != null);
exportButton.setEnabled(provider != null);
viewer.setInput(INPUT);
TreeItem[] items = tree.getItems();
for (int i = 0; i < items.length; i++)
{
if (items[i].getData() instanceof Category)
{
items[i].setBackground(UnifiedColorManager.getInstance().getColor(new RGB(192, 192, 192)));
}
}
if (tree.getItemCount() > 0)
{
tree.showItem(tree.getItem(0));
tree.showColumn(tree.getColumn(0));
}
}
/**
* Styles the import/export section
*/
private void styleImportExport()
{
Group io = new Group(displayArea, SWT.NONE);
io.setText(Messages.LoggingColorizationWidget_60);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
layout.marginHeight = 5;
layout.marginWidth = 5;
layout.verticalSpacing = 0;
layout.horizontalSpacing = 2;
io.setLayout(layout);
io.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false));
importButton = new Button(io, SWT.PUSH);
importButton.setEnabled(false);
importButton.setText(StringUtils.ellipsify(Messages.LoggingColorizationWidget_27));
importButton.addSelectionListener(new SelectionAdapter()
{
public void widgetSelected(SelectionEvent e)
{
FileDialog dialog = new FileDialog(displayArea.getShell(), SWT.OPEN);
dialog.setFilterExtensions(new String[] { "*.col" }); //$NON-NLS-1$
dialog.setText(Messages.LoggingColorizationWidget_63);
String path = dialog.open();
if (path != null)
{
if(!MessageDialog.openQuestion(LoggingPlugin.getActiveWorkbenchShell(),
Messages.LoggingColorizationWidget_ConfirmRewritingTitle,
Messages.LoggingColorizationWidget_ConfirmRewritingCurrentMessage))
{
return;
}
File file = new File(path);
provider.importColorization(file);
loadEditorOptions();
initializeColorizerView();
//regionViewer.refresh(); @regions
}
}
});
exportButton = new Button(io, SWT.PUSH);
exportButton.setEnabled(false);
exportButton.setText(StringUtils.ellipsify(Messages.LoggingColorizationWidget_64));
exportButton.addSelectionListener(new SelectionAdapter()
{
public void widgetSelected(SelectionEvent e)
{
FileDialog dialog = new FileDialog(displayArea.getShell(), SWT.SAVE);
dialog.setFilterExtensions(new String[] { "*.col" }); //$NON-NLS-1$
dialog.setText(Messages.LoggingColorizationWidget_66);
dialog.setFileName("colorization.col"); //$NON-NLS-1$
String path = dialog.open();
if (path != null)
{
File file = new File(path);
if (file.exists())
{
if(!MessageDialog.openQuestion(LoggingPlugin.getActiveWorkbenchShell(),
Messages.LoggingColorizationWidget_ConfirmRewritingTitle,
Messages.LoggingColorizationWidget_ConfirmRewritingMessage))
{
return;
}
}
try
{
provider.buildColorizationFile(file);
}
catch (LexerException e1)
{
IdeLog.logError(UnifiedEditorsPlugin.getDefault(), Messages.LoggingColorizationWidget_68);
}
}
}
});
}
/**
* Rebuild the styles
*/
public void saveStyles()
{
// UnifiedEditorsPlugin.getDefault().getPreferenceStore().setValue(IPreferenceConstants.EXPAND_EDITOR_OPTIONS,
// editorExpandable.isExpanded());
UnifiedEditorsPlugin.getDefault().getPreferenceStore().setValue(IPreferenceConstants.EXPAND_TOKENS,
tokenExpandable.isExpanded());
// UnifiedEditorsPlugin.getDefault().getPreferenceStore().setValue(IPreferenceConstants.EXPAND_REGIONS,
// regionExpandable.isExpanded()); @regions3
}
private void resetWidget()
{
setProvider(provider);
initializeColorizerView();
loadEditorOptions();
// regionViewer.getTable().deselectAll(); @regions
// addRegion.setEnabled(false); @regions
// remove.setEnabled(false); @regions
// regionViewer.refresh(); @regions
}
/**
* Resets this UI to the default colorization from the LanguageRegistry
*/
public void resetToDefaults()
{
TabItem[] selection = folder.getSelection();
if (selection != null && selection.length == 1)
{
TabItem item = selection[0];
int index = folder.indexOf(item);
if (index == 0)
{
provider.restoreGeneralDefaults();
}
else if (index == 1)
{
provider.restoreColorizationDefautls();
}
else
{
provider.resetToLanguageDefaults();
}
}
else
{
provider.resetToLanguageDefaults();
}
resetWidget();
}
/**
* Gets the provider for this widget
*
* @return - language structure provider
*/
public LoggingStructureProvider getProvider()
{
return provider;
}
/**
* Sets the provider for this widget
*
* @param provider
*/
public void setProvider(LoggingStructureProvider provider)
{
if (coloringComposite != null)
{
if (provider != null)
{
viewer.setContentProvider(provider);
viewer.setLabelProvider(provider);
}
else
{
viewer.setContentProvider(nullContentProvider);
viewer.setLabelProvider(nullLabelProvider);
}
this.provider = provider;
initializeColorizerView();
loadEditorOptions();
autoboldingBox.setSelection(provider.getAutoBolding());
wrappingBox.setSelection(provider.getWrapping());
timeoutText.setText(Integer.toString(provider.getReadTimeot()));
bufferText.setText(Integer.toString(provider.getReadBuffer()));
backlogText.setText(Integer.toString(provider.getBacklogLines()));
cursorLineColorSelector.setColorValue(provider.getCursorLineColor());
textForegroundColorSelector.setColorValue(provider.getTextForegroundColor());
String[] items = charsetCombo.getItems();
String currentValue = provider.getDefaultEncoding();
for (int i = 0; i < items.length; i++)
{
if (items[i].equals(currentValue))
{
charsetCombo.select(i);
}
}
FontData[] font = provider.getFont();
if (font != null && font.length > 0)
{
String fontStr = font[0].getName() + "-" + font[0].getHeight(); //$NON-NLS-1$
fontStyleLabel.setText(fontStr);
}
}
}
/**
* Edits rule.
*/
protected void editRule()
{
TreeItem[] selection = tree.getSelection();
if (selection != null && selection.length != 0)
{
IToken selected = getSelectedToken(selection[0]);
if (selected != null)
{
LoggingPreferences.Rule initialContent = null;
boolean isRegexp = true;
for (LoggingPreferences.Rule rule : provider.getCurrentRules())
{
if (rule.getName().equals(selected.getType()))
{
initialContent = rule;
}
}
NewRuleDialog dialog = new NewRuleDialog(coloringComposite.getShell(), initialContent);
if (dialog.open() == Window.OK)
{
provider.updateRule(selected, dialog.getContent(), dialog.isRegexp(), dialog.isCaseInsensitive());
viewer.refresh();
}
}
}
}
/**
* Removes rule.
*/
protected void removeRule()
{
TreeItem[] selection = tree.getSelection();
if (selection != null && selection.length != 0)
{
IToken selectedToken = getSelectedToken(selection[0]);
if (selectedToken != null)
{
provider.removeRule(selectedToken);
}
viewer.refresh();
}
}
/**
* Gets currently selected rule.
* @param selection - selection.
* @return rule or null.
*/
private IToken getSelectedToken(TreeItem selection)
{
IToken token = (IToken) selection.getData();
return token;
}
/**
* Adds new rule.
* @param isRegexp - whether rule is regexp-based.
*/
protected void addRule()
{
NewRuleDialog dialog = new NewRuleDialog(coloringComposite.getShell(), null);
List<String> forbiddenNames = new ArrayList<String>();
for (LoggingPreferences.Rule rule : provider.getCurrentRules())
{
forbiddenNames.add(rule.getName());
}
dialog.setForbiddenNames(forbiddenNames);
if (dialog.open() == Window.OK)
{
provider.addRuleToBeginning(dialog.getName(), dialog.getContent(), dialog.isRegexp(), dialog.isCaseInsensitive());
viewer.refresh();
}
}
/**
* Moves rule down.
*/
protected void moveRuleDown()
{
TreeItem[] selection = tree.getSelection();
if (selection != null && selection.length != 0)
{
IToken selectedToken = getSelectedToken(selection[0]);
if (selectedToken != null)
{
provider.moveRuleDown(selectedToken);
viewer.refresh();
TreeItem toSelect = getItemByToken(selectedToken);
if (toSelect != null)
{
tree.setSelection(toSelect);
}
}
}
}
/**
* Moves rule up.
*/
private void moveRuleUp()
{
TreeItem[] selection = tree.getSelection();
if (selection != null && selection.length != 0)
{
IToken selectedToken = getSelectedToken(selection[0]);
if (selectedToken != null)
{
provider.moveRuleUp(selectedToken);
viewer.refresh();
TreeItem toSelect = getItemByToken(selectedToken);
if (toSelect != null)
{
tree.setSelection(toSelect);
}
}
}
}
private TreeItem getItemByToken(IToken token)
{
TreeItem[] items = tree.getItems();
for (TreeItem item : items)
{
if (provider.tokensEqual((IToken) item.getData(), token))
{
return item;
}
}
return null;
}
/**
* @return
*/
private LoggingPreferences getPreferences()
{
return LoggingPlugin.getDefault().getLoggingPreferences();
}
}