blob: a93a3f9373fc1fb91974c4535712d30f165aed60 [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.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;
}
}