blob: 0f667bed5d80ab4f42dfe14256fa4e1ea4d34572 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008 Angelo Zerr 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:
* Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation
*******************************************************************************/
package org.akrogen.tkui.css.swt.examples.csseditors;
import java.io.File;
import java.util.ArrayList;
import org.akrogen.tkui.css.core.css2.CSS2FontPropertiesHelpers;
import org.akrogen.tkui.css.core.dom.IElementProvider;
import org.akrogen.tkui.css.core.dom.properties.css2.CSS2FontProperties;
import org.akrogen.tkui.css.core.engine.CSSEngine;
import org.akrogen.tkui.css.core.examples.csseditors.AbstractCSSEditor;
import org.akrogen.tkui.css.core.serializers.CSSSerializerConfiguration;
import org.akrogen.tkui.css.swt.dom.SWTElementProvider;
import org.akrogen.tkui.css.swt.dom.html.SWTHTMLElementProvider;
import org.akrogen.tkui.css.swt.engine.CSSSWTEngineImpl;
import org.akrogen.tkui.css.swt.serializers.CSSSWTSerializerConfiguration;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.RGB;
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.ColorDialog;
import org.eclipse.swt.widgets.Composite;
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.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.w3c.dom.css.CSSValue;
/**
* Abstract CSS SWT Editor.
*
* @version 1.0.0
* @author <a href="mailto:angelo.zerr@gmail.com">Angelo ZERR</a>
*
*/
public abstract class AbstractCSSSWTEditor extends AbstractCSSEditor {
protected static final String[] CSS_FILE_EXTENSION = { "*.css" };
private Display display;
/**
* Textarea wich contains content of CSS style sheet.
*/
private StyledText textArea;
private Button cacheResourcesCheckbox;
/**
* HTML checkbox to set if CSS must be typed with HTML syntaxe or SWT
* syntax.
*/
private Button htmlCheckbox;
/**
* Label wich display time elapsed when CSS Engine apply styles.
*/
private Label statusLabel;
/**
* Apply style when text area change
*/
private Button applyStyleWhenTextAreaChangeCheckbox;
/**
* Launch Apply style
*/
private Button applyStyleToShellCheckbox;
private Shell shell;
private Composite leftPanel;
private List cssFilesWidget;
private java.util.List cssFiles = new ArrayList();
private Text selectedCSSPropertyNameText = null;
private Text selectedCSSPropertyValueText = null;
protected int currentLine = -1;
protected AbstractCSSSWTEditor(String nativeWidgetDir,
String[] styleFileExtension) {
super(nativeWidgetDir);
}
protected AbstractCSSSWTEditor() {
super("swt");
}
public void display() {
display = new Display();
shell = new Shell(display, SWT.SHELL_TRIM);
GridLayout layout = new GridLayout();
layout.marginWidth = 0;
layout.marginHeight = 0;
layout.verticalSpacing = 3;
shell.setLayout(layout);
// create Menus
createMenus(shell);
/*
* Create a sash form.
*/
SashForm form = new SashForm(shell, SWT.NONE);
form.setLayoutData(new GridData(GridData.FILL_BOTH));
/*
* Create left panel with SWT Contents.
*/
createLeftPanel(form);
/*
* Create right panel with TextArea which contains CSS to load.
*/
createRightPanel(form);
form.setWeights(new int[] { 30, 80 });
/*
* Now we open the shell.
*/
shell.setSize(new Point(800, 600));
shell.open();
shell.setText("CSS Editors");
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
/*-------------------- Menus --------------------**/
/**
* Create Menus File, Options
*
* @param shell
*/
protected void createMenus(Shell shell) {
Menu menu = new Menu(shell, SWT.BAR);
shell.setMenuBar(menu);
// Create File item Menu
createMenuItemFile(menu, shell);
// Create Options item Menu
// createMenuItemOptions(menu);
}
/**
* Create Menu item File with sub menu New and Open
*
* @param menu
* @param shell
*/
protected void createMenuItemFile(Menu menu, final Shell shell) {
MenuItem menuFileHeader = new MenuItem(menu, SWT.CASCADE);
menuFileHeader.setText("&File");
// File menu
Menu menuFile = new Menu(shell, SWT.DROP_DOWN);
menuFileHeader.setMenu(menuFile);
// New item menu
MenuItem itemNew = new MenuItem(menuFile, SWT.PUSH);
itemNew.setText("&New...");
itemNew.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
fillTextareaWithDefaultStyleSheetContent();
}
});
// Open item menu
MenuItem itemOpen = new MenuItem(menuFile, SWT.PUSH);
itemOpen.setText("&Open...");
itemOpen.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
FileDialog dialog = new FileDialog(shell, SWT.NULL);
dialog.setFilterExtensions(CSS_FILE_EXTENSION);
dialog.setText("Select CSS style file");
dialog.setFilterPath(getBaseStyleDir().getAbsolutePath());
String path = dialog.open();
if (path != null) {
File file = new File(path);
fillTextareaWithStyleSheetContent(file);
}
}
});
}
/**
* Create Menu item Options
*
* @param menu
*/
protected void createMenuItemOptions(Menu menu) {
MenuItem menuOptionsHeader = new MenuItem(menu, SWT.CASCADE);
menuOptionsHeader.setText("&Options");
// Options menu
Menu menuOptions = new Menu(shell, SWT.DROP_DOWN);
menuOptionsHeader.setMenu(menuOptions);
// New item menu
MenuItem itemNew = new MenuItem(menuOptions, SWT.CHECK);
itemNew.setText("&Cache Resource...");
}
/*-------------------- Panel --------------------**/
protected void createLeftPanel(Composite parent) {
leftPanel = new Composite(parent, SWT.NONE);
leftPanel.setLayout(new FillLayout());
createContent(leftPanel);
}
protected void createRightPanel(Composite parent) {
SashForm form = new SashForm(parent, SWT.NONE);
form.setLayoutData(new GridData(GridData.FILL_BOTH));
GridLayout layout = new GridLayout();
layout.marginWidth = 0;
layout.marginHeight = 0;
layout.verticalSpacing = 3;
Composite composite = new Composite(form, SWT.NONE);
composite.setLayout(layout);
statusLabel = new Label(composite, SWT.NONE);
statusLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
// Create TextArea which contains CSS content.
textArea = new StyledText(composite, SWT.MULTI | SWT.V_SCROLL
| SWT.BORDER);
textArea.setLayoutData(new GridData(GridData.FILL_BOTH));
textArea.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
if (applyStyleWhenTextAreaChangeCheckbox.getSelection())
applyStyles();
}
});
textArea.addKeyListener(new KeyAdapter() {
public void keyReleased(KeyEvent e) {
displaySelectedCSSProperty();
}
});
textArea.addMouseListener(new MouseAdapter() {
public void mouseDown(MouseEvent e) {
displaySelectedCSSProperty();
}
});
layout = new GridLayout();
layout.marginWidth = 0;
layout.marginHeight = 0;
layout.verticalSpacing = 3;
composite = new Composite(form, SWT.NONE);
composite.setLayout(layout);
Group group = new Group(composite, SWT.NONE);
group.setText("Selected CSS Property");
layout = new GridLayout(2, true);
layout.verticalSpacing = 3;
group.setLayout(layout);
group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Label label = new Label(group, SWT.NONE);
label.setText("CSS Property name");
selectedCSSPropertyNameText = new Text(group, SWT.BORDER
| SWT.READ_ONLY);
selectedCSSPropertyNameText.setLayoutData(new GridData(
GridData.FILL_HORIZONTAL));
label = new Label(group, SWT.NONE);
label.setText("CSS Property value");
selectedCSSPropertyValueText = new Text(group, SWT.BORDER);
selectedCSSPropertyValueText.setLayoutData(new GridData(
GridData.FILL_HORIZONTAL));
selectedCSSPropertyValueText.addKeyListener(new KeyAdapter() {
public void keyReleased(KeyEvent e) {
String property = selectedCSSPropertyNameText.getText();
property += ":";
property += selectedCSSPropertyValueText.getText();
updateSelectedCSSPropertyValue(property);
}
});
final Button b = new Button(group, SWT.PUSH | SWT.BORDER);
b.setText("Change Color");
b.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
ColorDialog colorDialog = new ColorDialog(shell);
colorDialog.setText("ColorDialog Demo");
String cssValue = selectedCSSPropertyValueText.getText();
if (cssValue != null && cssValue.length() > 0) {
try {
CSSValue value = engine.parsePropertyValue(cssValue);
RGB rgb = (RGB) engine.convert(value, RGB.class, null);
if (rgb != null)
colorDialog.setRGB(rgb);
} catch (Exception ex) {
handleExceptions(ex);
}
// engine.convert(, RGB.class,);
}
RGB newColor = colorDialog.open();
if (newColor != null) {
try {
cssValue = engine.convert(newColor, RGB.class,
selectedCSSPropertyNameText.getText());
if (cssValue == null)
return;
selectedCSSPropertyValueText.setText(cssValue);
String property = selectedCSSPropertyNameText.getText();
property += ":";
property += selectedCSSPropertyValueText.getText();
updateSelectedCSSPropertyValue(property);
} catch (Exception ex) {
handleExceptions(ex);
}
}
}
});
final Button b2 = new Button(group, SWT.PUSH | SWT.BORDER);
b2.setText("Change Font");
b2.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
FontDialog fontDialog = new FontDialog(shell);
fontDialog.setText("Choose the font");
String value = selectedCSSPropertyValueText.getText();
try {
String propertyName = selectedCSSPropertyNameText.getText();
CSSValue cssValue = engine.parsePropertyValue(value);
CSS2FontProperties fontProperties = CSS2FontPropertiesHelpers
.createCSS2FontProperties(cssValue, propertyName);
FontData fontData = (FontData) engine.convert(fontProperties,
FontData.class, display);
if (fontData != null) {
FontData[] fontDatas = { fontData };
fontDialog.setFontList(fontDatas);
}
} catch (Exception ex) {
handleExceptions(ex);
}
FontData newFontData = fontDialog.open();
if (newFontData != null) {
try {
String cssValue = engine.convert(newFontData,
FontData.class, selectedCSSPropertyNameText
.getText());
if (cssValue == null)
return;
selectedCSSPropertyValueText.setText(cssValue);
String property = selectedCSSPropertyNameText.getText();
property += ":";
property += selectedCSSPropertyValueText.getText();
updateSelectedCSSPropertyValue(property);
} catch (Exception ex) {
handleExceptions(ex);
}
}
}
});
group = new Group(composite, SWT.NONE);
group.setText("CSS Engine options");
layout = new GridLayout();
layout.verticalSpacing = 3;
group.setLayout(layout);
group.setLayoutData(new GridData(GridData.FILL_BOTH));
cacheResourcesCheckbox = new Button(group, SWT.CHECK);
cacheResourcesCheckbox.setText("Cache Color, Font and Cursor");
cacheResourcesCheckbox.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
if (!cacheResourcesCheckbox.getSelection()) {
engine.getResourcesRegistry().dispose();
}
}
});
cacheResourcesCheckbox.setSelection(true);
applyStyleWhenTextAreaChangeCheckbox = new Button(group, SWT.CHECK);
applyStyleWhenTextAreaChangeCheckbox
.setText("Apply style when textarea change");
applyStyleWhenTextAreaChangeCheckbox.setSelection(true);
htmlCheckbox = new Button(group, SWT.CHECK);
htmlCheckbox.setText("is HTML Selector? (otherwise it's SWT Selector)");
htmlCheckbox.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
populateCSSFiles();
applyStylesFromSelectedFile();
}
});
// Create CSS files list
cssFilesWidget = new List(group, SWT.NONE);
cssFilesWidget.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
cssFilesWidget.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
applyStylesFromSelectedFile();
}
});
populateCSSFiles();
// Create Apply Style Button.
applyStyleToShellCheckbox = new Button(group, SWT.CHECK);
applyStyleToShellCheckbox.setText("Apply sytle to fully Shell?");
applyStyleToShellCheckbox.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
if (applyStyleToShellCheckbox.getSelection()) {
applyStyles();
} else {
// Apply styles with NONE style to reset
// styles applied into TextArea...
engine = getCSSEngine();
engine.applyStyles(shell, true);
// Apply styles
applyStyles();
}
}
});
Button applyStyleButton = new Button(group, SWT.BORDER);
applyStyleButton.setText("Apply style");
applyStyleButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
applyStyles();
}
});
form.setWeights(new int[] { 120, 90 });
// Select the first CSS style file
applyStylesFromSelectedFile();
}
public abstract void createContent(Composite parent);
protected void displaySelectedCSSProperty() {
selectedCSSPropertyNameText.setText("");
selectedCSSPropertyValueText.setText("");
int start = -1;
int end = -1;
// if (currentLine != -1)
// textArea.setLineBackground(currentLine, 1, null);
currentLine = textArea.getLineAtOffset(textArea.getCaretOffset());
if (currentLine + 1 >= textArea.getLineCount())
return;
start = textArea.getOffsetAtLine(currentLine);
end = textArea.getOffsetAtLine(currentLine + 1) - 2;
if (start <= end) {
String lineText = textArea.getText(start, end);
lineText = lineText.trim();
int index = lineText.indexOf(":");
if (index > 0) {
if (lineText.indexOf("{") != -1)
return;
String property = lineText.substring(0, index);
String value = lineText.substring(index + 1, lineText.length());
value = value.replaceAll(";", "");
// Remove comment
int commentIndex = value.indexOf("/*");
if (commentIndex > 0)
value = value.substring(0, commentIndex);
selectedCSSPropertyNameText.setText(property);
selectedCSSPropertyValueText.setText(value);
// textArea.setLineBackground(currentLine, 1, display
// .getSystemColor(SWT.COLOR_MAGENTA));
}
}
}
protected void updateSelectedCSSPropertyValue(String text) {
if (currentLine != -1 && currentLine + 1 >= textArea.getLineCount())
return;
int start = textArea.getOffsetAtLine(currentLine);
int end = textArea.getOffsetAtLine(currentLine + 1) - 2;
String startLineText = textArea.getText(0, start);
String endLineText = textArea.getText(end, textArea.getCharCount() - 1);
if (!text.endsWith(";") && !endLineText.startsWith(";"))
text += ";";
if (endLineText.startsWith(":"))
endLineText.substring(1, endLineText.length());
String newContent = startLineText + text + endLineText;
textArea.setText(newContent);
}
/*-------------------- AbstractCSSEditor methods implementation --------------------**/
/*
* (non-Javadoc)
*
* @see org.akrogen.tkui.core.css.examples.csseditors.AbstractCSSEditor#createCSSEngine()
*/
protected CSSEngine createCSSEngine() {
return new CSSSWTEngineImpl(shell.getDisplay());
}
/*
* (non-Javadoc)
*
* @see org.akrogen.tkui.core.css.examples.csseditors.AbstractCSSEditor#getHTMLElementProvider()
*/
protected IElementProvider getHTMLElementProvider() {
return SWTHTMLElementProvider.INSTANCE;
}
/*
* (non-Javadoc)
*
* @see org.akrogen.tkui.core.css.examples.csseditors.AbstractCSSEditor#getNativeWidgetElementProvider()
*/
protected IElementProvider getNativeWidgetElementProvider() {
return SWTElementProvider.INSTANCE;
}
/*
* (non-Javadoc)
*
* @see org.akrogen.tkui.core.css.examples.csseditors.AbstractCSSEditor#isHTMLSelector()
*/
protected boolean isHTMLSelector() {
return htmlCheckbox.getSelection();
}
/*
* (non-Javadoc)
*
* @see org.akrogen.tkui.core.css.examples.csseditors.AbstractCSSEditor#getStyleSheetContent()
*/
protected String getStyleSheetContent() {
return textArea.getText();
}
/*
* (non-Javadoc)
*
* @see org.akrogen.tkui.core.css.examples.csseditors.AbstractCSSEditor#setStyleSheetContent(java.lang.String)
*/
protected void setStyleSheetContent(String content) {
textArea.setText(content);
}
/*
* (non-Javadoc)
*
* @see org.akrogen.tkui.core.css.examples.csseditors.AbstractCSSEditor#setCSSEngineStatuts(java.lang.String)
*/
protected void setCSSEngineStatuts(String status) {
statusLabel.setText(status);
}
/*
* (non-Javadoc)
*
* @see org.akrogen.tkui.core.css.examples.csseditors.AbstractCSSEditor#mustApplyStylesToWindow()
*/
protected boolean mustApplyStylesToWindow() {
return applyStyleToShellCheckbox.getSelection();
}
/*
* (non-Javadoc)
*
* @see org.akrogen.tkui.core.css.examples.csseditors.AbstractCSSEditor#getLeftPanelNativeWidget()
*/
protected Object getLeftPanelNativeWidget() {
return leftPanel;
}
/*
* (non-Javadoc)
*
* @see org.akrogen.tkui.core.css.examples.csseditors.AbstractCSSEditor#getWindowNativeWidget()
*/
protected Object getWindowNativeWidget() {
return shell;
}
/*
* (non-Javadoc)
*
* @see org.akrogen.tkui.core.css.examples.csseditors.AbstractCSSEditor#getCSSNativeWidgetSerializerConfiguration()
*/
protected CSSSerializerConfiguration getCSSNativeWidgetSerializerConfiguration() {
return CSSSWTSerializerConfiguration.INSTANCE;
}
/*
* (non-Javadoc)
*
* @see org.akrogen.tkui.core.css.examples.csseditors.AbstractCSSEditor#getCSSFileWidgetItemCount()
*/
protected int getCSSFilesWidgetItemCount() {
return cssFilesWidget.getItemCount();
}
/*
* (non-Javadoc)
*
* @see org.akrogen.tkui.core.css.examples.csseditors.AbstractCSSEditor#getCSSFileWidgetSelectionIndex()
*/
protected int getCSSFilesWidgetSelectionIndex() {
return cssFilesWidget.getSelectionIndex();
}
/*
* (non-Javadoc)
*
* @see org.akrogen.tkui.core.css.examples.csseditors.AbstractCSSEditor#selectCSSFileWidget(int)
*/
protected void selectCSSFilesWidget(int index) {
cssFilesWidget.select(index);
}
/*
* (non-Javadoc)
*
* @see org.akrogen.tkui.core.css.examples.csseditors.AbstractCSSEditor#addCSSFilesWidget(java.lang.String)
*/
protected void addItemCSSFilesWidget(String item) {
cssFilesWidget.add(item);
}
/*
* (non-Javadoc)
*
* @see org.akrogen.tkui.core.css.examples.csseditors.AbstractCSSEditor#removeAllCSSFilesWidget()
*/
protected void removeAllCSSFilesWidget() {
cssFilesWidget.removeAll();
}
}