| /******************************************************************************* |
| * 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.core.examples.csseditors; |
| |
| import java.io.BufferedReader; |
| import java.io.File; |
| import java.io.FileInputStream; |
| import java.io.InputStream; |
| import java.io.InputStreamReader; |
| import java.io.StringReader; |
| import java.io.StringWriter; |
| import java.util.ArrayList; |
| import java.util.Date; |
| |
| import org.akrogen.tkui.css.core.dom.IElementProvider; |
| import org.akrogen.tkui.css.core.engine.CSSEngine; |
| import org.akrogen.tkui.css.core.engine.CSSErrorHandler; |
| import org.akrogen.tkui.css.core.serializers.CSSHTMLSerializerConfiguration; |
| import org.akrogen.tkui.css.core.serializers.CSSSerializer; |
| import org.akrogen.tkui.css.core.serializers.CSSSerializerConfiguration; |
| |
| /** |
| * Abstract CSS Editor. |
| * |
| * @version 1.0.0 |
| * @author <a href="mailto:angelo.zerr@gmail.com">Angelo ZERR</a> |
| * |
| */ |
| public abstract class AbstractCSSEditor { |
| |
| /** |
| * CSS Engine. |
| */ |
| protected CSSEngine engine; |
| |
| /** |
| * CSS Serializer |
| */ |
| protected CSSSerializer serializer; |
| |
| protected String nativeWidgetDir; |
| |
| protected java.util.List cssFiles = new ArrayList(); |
| |
| protected AbstractCSSEditor(String nativeWidgetDir) { |
| this.nativeWidgetDir = nativeWidgetDir; |
| } |
| |
| /** |
| * Return CSS Engine configured. |
| * |
| * @return |
| */ |
| protected CSSEngine getCSSEngine() { |
| if (engine == null) { |
| // Get SWT CSS Engine |
| engine = createCSSEngine(); |
| // Error |
| engine.setErrorHandler(new CSSErrorHandler() { |
| public void error(Exception e) { |
| handleExceptions(e); |
| } |
| }); |
| |
| } else { |
| // Remove all style sheets. |
| engine.reset(); |
| } |
| |
| if (isHTMLSelector()) { |
| // Register HTML Element Provider to retrieve |
| // w3c Element HTMLElement coming from Native Widget. |
| engine.setElementProvider(getHTMLElementProvider()); |
| } else { |
| // Register Native Widget (SWT, Swing...) Element Provider to |
| // retrieve |
| // w3c Element Element coming from Native Widget. |
| engine.setElementProvider(getNativeWidgetElementProvider()); |
| } |
| return engine; |
| } |
| |
| /** |
| * Apply Styles comming from <code>getStyleSheetContent()</code> method to |
| * implement <code>widget</code>. |
| * |
| * @param widget |
| */ |
| protected void applyStyles(Object widget) { |
| try { |
| Date d1 = new Date(); |
| engine = getCSSEngine(); |
| // 1. Parse Style Sheet coming from getStyleSheetContent(). |
| StringReader reader = new StringReader(getStyleSheetContent()); |
| engine.parseStyleSheet(reader); |
| |
| // 2. Apply styles |
| engine.applyStyles(widget, true, true); |
| Date d2 = new Date(); |
| |
| // 3. Display time elapsed |
| setCSSEngineStatuts("Apply style with " |
| + (d2.getTime() - d1.getTime()) + "ms."); |
| |
| } catch (Exception ex) { |
| handleExceptions(ex); |
| } |
| } |
| |
| /** |
| * Apply styles to the fully window or left panel widget. |
| */ |
| protected void applyStyles() { |
| if (mustApplyStylesToWindow()) { |
| applyStyles(getWindowNativeWidget()); |
| } else |
| applyStyles(getLeftPanelNativeWidget()); |
| } |
| |
| protected void fillTextareaWithStyleSheetContent(File file) { |
| try { |
| fillTextareaWithStyleSheetContent(new FileInputStream(file)); |
| } catch (Exception e) { |
| handleExceptions(e); |
| } |
| } |
| |
| /** |
| * Fill the TextArea which store the style sheet content with the |
| * <code>stream</code> content. |
| * |
| * @param stream |
| */ |
| protected void fillTextareaWithStyleSheetContent(InputStream stream) { |
| try { |
| StringWriter writer = new StringWriter(); |
| InputStreamReader streamReader = new InputStreamReader(stream); |
| BufferedReader buffer = new BufferedReader(streamReader); |
| String line = ""; |
| boolean b = false; |
| while (null != (line = buffer.readLine())) { |
| if (b) |
| writer.write("\n"); |
| writer.write(line); |
| b = true; |
| } |
| buffer.close(); |
| streamReader.close(); |
| String content = writer.toString(); |
| setStyleSheetContent(content); |
| } catch (Exception e) { |
| handleExceptions(e); |
| } |
| } |
| |
| protected void fillTextareaWithDefaultStyleSheetContent() { |
| if (mustApplyStylesToWindow()) |
| fillTextareaWithDefaultStyleSheetContent(getWindowNativeWidget()); |
| else |
| fillTextareaWithDefaultStyleSheetContent(getLeftPanelNativeWidget()); |
| } |
| |
| protected void fillTextareaWithDefaultStyleSheetContent(Object widget) { |
| if (serializer == null) |
| this.serializer = new CSSSerializer(); |
| StringWriter writer = new StringWriter(); |
| try { |
| CSSSerializerConfiguration configuration = (isHTMLSelector() ? getCSSHTMLSerializerConfiguration() |
| : getCSSNativeWidgetSerializerConfiguration()); |
| serializer.serialize(writer, getCSSEngine(), widget, true, |
| configuration); |
| setStyleSheetContent(writer.toString()); |
| } catch (Exception e) { |
| handleExceptions(e); |
| } |
| } |
| |
| protected void applyStylesFromSelectedFile() { |
| int index = getCSSFilesWidgetSelectionIndex(); |
| if (index == -1) |
| if (getCSSFilesWidgetItemCount() > 1) { |
| index = 1; |
| selectCSSFilesWidget(index); |
| // cssFilesWidget.select(index); |
| } |
| if (index < 1) { |
| setStyleSheetContent(""); |
| return; |
| } |
| File file = (File) cssFiles.get(index - 1); |
| fillTextareaWithStyleSheetContent(file); |
| } |
| |
| protected void populateCSSFiles() { |
| removeAllCSSFilesWidget(); |
| int size = cssFiles.size(); |
| for (int i = 0; i < size; i++) { |
| cssFiles.remove(0); |
| } |
| addItemCSSFilesWidget("None"); |
| File baseDir = getBaseStyleDir(); |
| File[] files = baseDir.listFiles(); |
| for (int i = 0; i < files.length; i++) { |
| File file = files[i]; |
| if (file.isFile()) { |
| addItemCSSFilesWidget(file.getName()); |
| cssFiles.add(file); |
| } |
| } |
| } |
| |
| /** |
| * Display CSS Engine error |
| * |
| * @param e |
| */ |
| protected void handleExceptions(Exception e) { |
| e.printStackTrace(); |
| } |
| |
| protected File getBaseStyleDir() { |
| if (isHTMLSelector()) |
| return new File(getBaseStyleDirName() + "/html"); |
| if (nativeWidgetDir != null) |
| return new File(getBaseStyleDirName() + "/" + nativeWidgetDir); |
| return new File(getBaseStyleDirName()); |
| } |
| |
| protected String getBaseStyleDirName() { |
| return "styles"; |
| } |
| |
| /** |
| * Create Instance of CSS Engine |
| * |
| * @return |
| */ |
| protected abstract CSSEngine createCSSEngine(); |
| |
| /** |
| * Return true if HTML selector must be used and false if Native Widget |
| * Selector must be used. |
| * |
| * @return |
| */ |
| protected abstract boolean isHTMLSelector(); |
| |
| /** |
| * Return Native Widget Element provider. |
| * |
| * @return |
| */ |
| protected abstract IElementProvider getNativeWidgetElementProvider(); |
| |
| /** |
| * Return HTML Element provider. |
| * |
| * @return |
| */ |
| protected abstract IElementProvider getHTMLElementProvider(); |
| |
| /** |
| * Return style sheet content. |
| * |
| * @return |
| */ |
| protected abstract String getStyleSheetContent(); |
| |
| /** |
| * Set style sheet content. |
| * |
| * @param content |
| */ |
| protected abstract void setStyleSheetContent(String content); |
| |
| /** |
| * Set CSS Engine status. |
| * |
| * @param status |
| */ |
| protected abstract void setCSSEngineStatuts(String status); |
| |
| /** |
| * Return true if Styles must be applied to the fully Window and false |
| * otherwise. |
| * |
| * @return |
| */ |
| protected abstract boolean mustApplyStylesToWindow(); |
| |
| /** |
| * Get Window Native Widget. |
| * |
| * @return |
| */ |
| protected abstract Object getWindowNativeWidget(); |
| |
| /** |
| * Get Left Panel Native widget. |
| * |
| * @return |
| */ |
| protected abstract Object getLeftPanelNativeWidget(); |
| |
| /** |
| * Return CSS Serializer configuration for Native Widget. |
| * |
| * @return |
| */ |
| protected abstract CSSSerializerConfiguration getCSSNativeWidgetSerializerConfiguration(); |
| |
| /** |
| * Return CSS Serializer configuration for HTML. |
| * |
| * @return |
| */ |
| protected CSSSerializerConfiguration getCSSHTMLSerializerConfiguration() { |
| return CSSHTMLSerializerConfiguration.INSTANCE; |
| } |
| |
| /** |
| * Return selection index of CSS files widget. |
| * |
| * @return |
| */ |
| protected abstract int getCSSFilesWidgetSelectionIndex(); |
| |
| /** |
| * Return item count of CSS files widget. |
| * |
| * @return |
| */ |
| protected abstract int getCSSFilesWidgetItemCount(); |
| |
| /** |
| * Select item of CSS files widget at <code>index</code>. |
| * |
| * @param index |
| */ |
| protected abstract void selectCSSFilesWidget(int index); |
| |
| /** |
| * Remove all items of CSS files widget. |
| */ |
| protected abstract void removeAllCSSFilesWidget(); |
| |
| /** |
| * Add item of CSS files widget. |
| * |
| * @param item |
| */ |
| protected abstract void addItemCSSFilesWidget(String item); |
| |
| } |