| /******************************************************************************* |
| * 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.chat; |
| |
| import java.io.InputStream; |
| |
| import org.akrogen.tkui.css.core.engine.CSSEngine; |
| import org.akrogen.tkui.css.core.impl.engine.CSSErrorHandlerImpl; |
| import org.akrogen.tkui.css.swt.engine.CSSSWTEngineImpl; |
| import org.akrogen.tkui.css.swt.resources.CSSSWTResources; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.custom.CLabel; |
| import org.eclipse.swt.custom.CTabFolder; |
| import org.eclipse.swt.custom.CTabItem; |
| import org.eclipse.swt.custom.SashForm; |
| import org.eclipse.swt.events.KeyAdapter; |
| import org.eclipse.swt.events.KeyEvent; |
| import org.eclipse.swt.events.SelectionAdapter; |
| import org.eclipse.swt.events.SelectionEvent; |
| import org.eclipse.swt.events.SelectionListener; |
| import org.eclipse.swt.graphics.Point; |
| import org.eclipse.swt.layout.FillLayout; |
| import org.eclipse.swt.layout.GridData; |
| import org.eclipse.swt.layout.GridLayout; |
| import org.eclipse.swt.widgets.Button; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Display; |
| import org.eclipse.swt.widgets.Label; |
| import org.eclipse.swt.widgets.Shell; |
| import org.eclipse.swt.widgets.Text; |
| import org.eclipse.swt.widgets.ToolBar; |
| import org.eclipse.swt.widgets.ToolItem; |
| import org.eclipse.swt.widgets.Tree; |
| import org.eclipse.swt.widgets.TreeItem; |
| import org.eclipse.swt.widgets.Widget; |
| |
| public abstract class AbstractChatExample { |
| |
| protected static Display display; |
| private static CTabFolder tabFolder; |
| private static Tree tree; |
| private static final String[] GROUPS = new String[] { "Work", "RCP Dev", |
| "Friends" }; |
| private static final String[] NAMES = new String[] { "Betty Zechman", |
| "Susan Adams", "Samantha Daryn", "Ted Amado" }; |
| private static final String INPUT_TEXT = "Do you know where I can find the Eclipsecon ppt template?"; |
| private static final String OUTPUT_TEXT = "Matt> Gotta sec to chat?\n\r\n\rBetty> Sure what's up"; |
| |
| private InputStream styleSheetStream; |
| |
| protected CSSEngine engine; |
| |
| public AbstractChatExample(InputStream styleSheetStream) { |
| this.styleSheetStream = styleSheetStream; |
| } |
| |
| public void display() throws Exception { |
| /* |
| * Create the display and shell. |
| */ |
| display = new Display(); |
| final Shell shell = new Shell(display); |
| GridLayout layout = new GridLayout(); |
| layout.marginWidth = 0; |
| layout.marginHeight = 0; |
| layout.verticalSpacing = 3; |
| shell.setLayout(layout); |
| /* |
| * Create a toolbar |
| */ |
| { |
| ToolBar toolbar = new ToolBar(shell, SWT.FLAT | SWT.RIGHT |
| | SWT.NO_FOCUS); |
| toolbar.setForeground(display.getSystemColor(SWT.COLOR_RED)); |
| toolbar.setLayoutData(new GridData(GridData.FILL_HORIZONTAL |
| | GridData.GRAB_HORIZONTAL)); |
| ToolItem item = new ToolItem(toolbar, SWT.PUSH); |
| item.setText("File"); |
| item = new ToolItem(toolbar, SWT.PUSH); |
| item.setText("Edit"); |
| item = new ToolItem(toolbar, SWT.PUSH); |
| item.setText("Help"); |
| } |
| |
| |
| if (styleSheetStream == null) { |
| // Create Styles themes |
| createThemesStyleComposite(shell); |
| } |
| |
| /* |
| * Create a sash form. |
| */ |
| SashForm form = new SashForm(shell, SWT.NONE); |
| form.setLayoutData(new GridData(GridData.FILL_BOTH)); |
| /* |
| * Create the buddylist tree. |
| */ |
| { |
| tree = new Tree(form, SWT.SINGLE); |
| tree.addSelectionListener(new SelectionListener() { |
| public void widgetDefaultSelected(SelectionEvent e) { |
| if (((TreeItem) e.item).getParentItem() != null) { |
| try { |
| createChatControl(e.item); |
| } catch (Exception ex) { |
| ex.printStackTrace(); |
| } |
| } |
| } |
| |
| public void widgetSelected(SelectionEvent e) { |
| } |
| }); |
| for (int i = 0; i < GROUPS.length; i++) { |
| String g = GROUPS[i]; |
| TreeItem parentItem = new TreeItem(tree, SWT.NONE); |
| parentItem.setText(g); |
| for (int j = 0; j < NAMES.length; j++) { |
| String n = NAMES[j]; |
| TreeItem item = new TreeItem(parentItem, SWT.NONE); |
| item.setText(n); |
| } |
| parentItem.setExpanded(true); |
| } |
| } |
| /* |
| * Add the tabfolder |
| */ |
| { |
| tabFolder = new CTabFolder(form, SWT.CLOSE); |
| tabFolder.setUnselectedCloseVisible(true); |
| tabFolder.setUnselectedImageVisible(true); |
| form.setWeights(new int[] { 30, 70 }); |
| // open a couple chats |
| createChatControl(tree.getItem(0).getItems()[0]); |
| createChatControl(tree.getItem(0).getItems()[1]); |
| tabFolder.setSelection(tabFolder.getItem(0)); |
| } |
| /* |
| * Create a statusbar |
| */ |
| { |
| CLabel statusbar = new CLabel(shell, SWT.NONE); |
| GridData gd = new GridData(GridData.FILL_HORIZONTAL |
| | GridData.GRAB_HORIZONTAL); |
| statusbar.setLayoutData(gd); |
| statusbar.setText("Samantha Daryn is online"); |
| } |
| /* |
| * StyleHelper is used to parse and apply styles. |
| */ |
| engine = getCSSEngine(); |
| if (styleSheetStream != null) { |
| engine.parseStyleSheet(styleSheetStream); |
| engine.applyStyles(shell, true); |
| } |
| /* |
| * Now we open the shell. |
| */ |
| shell.setSize(new Point(600, 600)); |
| shell.open(); |
| shell.setText("CSS Instant Messaging"); |
| while (!shell.isDisposed()) { |
| if (!display.readAndDispatch()) |
| display.sleep(); |
| } |
| display.dispose(); |
| } |
| |
| /* |
| * The key listeners we add workaround a bug int Text that don't repaint |
| * properly when they have background images. |
| */ |
| protected void createChatControl(Widget item) throws Exception { |
| CTabItem tabItem = new CTabItem(tabFolder, SWT.NONE); |
| tabItem.setText("Chat with " + ((TreeItem) item).getText()); |
| SashForm textForm = new SashForm(tabFolder, SWT.VERTICAL); |
| final Text text1 = new Text(textForm, SWT.MULTI); |
| text1.setData("id", "output"); |
| text1.setText(OUTPUT_TEXT); |
| text1.addKeyListener(new KeyAdapter() { |
| public void keyPressed(KeyEvent arg0) { |
| text1.redraw(); |
| } |
| }); |
| final Text text2 = new Text(textForm, SWT.MULTI); |
| text2.setData("id", "input"); |
| text2.setText(INPUT_TEXT); |
| text2.addKeyListener(new KeyAdapter() { |
| public void keyPressed(KeyEvent arg0) { |
| text2.redraw(); |
| } |
| }); |
| tabItem.setControl(textForm); |
| textForm.setWeights(new int[] { 80, 20 }); |
| getCSSEngine().applyStyles(textForm, false); |
| tabFolder.setSelection(tabItem); |
| } |
| |
| protected void createThemesStyleComposite(final Composite parent) { |
| Composite themesComposite = new Composite(parent, SWT.NONE); |
| FillLayout fillLayout = new FillLayout(); |
| themesComposite.setLayout(fillLayout); |
| // no style Radio |
| Label noStyleLabel = new Label(themesComposite, SWT.NONE); |
| noStyleLabel.setText("No style"); |
| Button noStyleRadio = new Button(themesComposite, SWT.RADIO); |
| noStyleRadio.addSelectionListener(new SelectionAdapter() { |
| public void widgetSelected(SelectionEvent e) { |
| CSSEngine engine = getCSSEngine(); |
| engine.reset(); |
| engine.applyStyles(parent, true, true); |
| } |
| }); |
| // Matrix style Radio |
| Label matrixStyleLabel = new Label(themesComposite, SWT.NONE); |
| matrixStyleLabel.setText("Matrix style"); |
| Button matrixStyleRadio = new Button(themesComposite, SWT.RADIO); |
| matrixStyleRadio.addSelectionListener(new SelectionAdapter() { |
| public void widgetSelected(SelectionEvent e) { |
| CSSEngine engine = getCSSEngine(); |
| engine.reset(); |
| try { |
| engine.parseStyleSheet(CSSSWTResources.getSWTMatrix()); |
| engine.applyStyles(parent, true, true); |
| } |
| catch(Exception ex) { |
| ex.printStackTrace(); |
| } |
| } |
| }); |
| // Osx style Radio |
| Label osxStyleLabel = new Label(themesComposite, SWT.NONE); |
| osxStyleLabel.setText("Osx style"); |
| Button osxStyleRadio = new Button(themesComposite, SWT.RADIO); |
| osxStyleRadio.addSelectionListener(new SelectionAdapter() { |
| public void widgetSelected(SelectionEvent e) { |
| CSSEngine engine = getCSSEngine(); |
| engine.reset(); |
| try { |
| engine.parseStyleSheet(CSSSWTResources.getSWTOsx()); |
| engine.applyStyles(parent, true, true); |
| } |
| catch(Exception ex) { |
| ex.printStackTrace(); |
| } |
| } |
| }); |
| // Vista style Radio |
| Label vistaStyleLabel = new Label(themesComposite, SWT.NONE); |
| vistaStyleLabel.setText("Vista style"); |
| Button vistaStyleRadio = new Button(themesComposite, SWT.RADIO); |
| vistaStyleRadio.addSelectionListener(new SelectionAdapter() { |
| public void widgetSelected(SelectionEvent e) { |
| CSSEngine engine = getCSSEngine(); |
| engine.reset(); |
| try { |
| engine.parseStyleSheet(CSSSWTResources.getSWTVista()); |
| engine.applyStyles(parent, true, true); |
| } |
| catch(Exception ex) { |
| ex.printStackTrace(); |
| } |
| } |
| }); |
| } |
| |
| protected CSSEngine getCSSEngine() { |
| if (engine == null) { |
| engine = new CSSSWTEngineImpl(display); |
| // Print stack trace when Exception is thrown |
| engine.setErrorHandler(CSSErrorHandlerImpl.INSTANCE); |
| } |
| return engine; |
| } |
| } |