blob: dd89c222a3d2b7bcada209ccec033fcc370c93fc [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:w="urn:schemas-microsoft-com:office:word"
xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta name=Title content="Jabbering Consoles">
<meta name=Keywords content="">
<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
<meta name=ProgId content=Word.Document>
<meta name=Generator content="Microsoft Word 11">
<meta name=Originator content="Microsoft Word 11">
<link rel=File-List href="article_files/filelist.xml">
<link rel=Edit-Time-Data href="article_files/editdata.mso">
<!--[if !mso]>
<style>
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style>
<![endif]-->
<title>Jabbering Consoles</title>
<!--[if gte mso 9]><xml>
<o:DocumentProperties>
<o:Author>Kevin Barnes</o:Author>
<o:Template>Normal</o:Template>
<o:LastAuthor>Kevin Barnes</o:LastAuthor>
<o:Revision>2</o:Revision>
<o:Created>2005-10-17T20:19:00Z</o:Created>
<o:LastSaved>2005-10-18T14:34:00Z</o:LastSaved>
<o:Pages>2</o:Pages>
<o:Words>2204</o:Words>
<o:Characters>12567</o:Characters>
<o:Lines>104</o:Lines>
<o:Paragraphs>25</o:Paragraphs>
<o:CharactersWithSpaces>15433</o:CharactersWithSpaces>
<o:Version>11.512</o:Version>
</o:DocumentProperties>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:WordDocument>
<w:Zoom>150</w:Zoom>
</w:WordDocument>
</xml><![endif]-->
<link rel=Stylesheet type="text/css" media=all
href="file://localhost/Users/kevinbarnes/Eclipse/workspace/platform-debug-home/articles/ConsoleExample/default_style.css">
<link rel=Stylesheet type="text/css" media=all
href="file://localhost/Users/kevinbarnes/Eclipse/workspace/platform-debug-home/articles/ConsoleExample/default_style.css">
<style>
<!--
<link rel=Stylesheet type="text/css" media=all
href="file://localhost/Users/kevinbarnes/Eclipse/workspace/platform-debug-home/articles/ConsoleExample/default_style.css">
<link rel=Stylesheet type="text/css" media=all
href="file://localhost/Users/kevinbarnes/Eclipse/workspace/platform-debug-home/articles/ConsoleExample/default_style.css">
/* Font Definitions */
@font-face
{font-family:"Times New Roman";
panose-1:0 2 2 6 3 5 4 5 2 3;
mso-font-charset:0;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:50331648 0 0 0 1 0;}
@font-face
{font-family:Arial;
panose-1:0 2 11 6 4 2 2 2 2 2;
mso-font-charset:0;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:50331648 0 0 0 1 0;}
@font-face
{font-family:"Courier New";
panose-1:0 2 7 3 9 2 2 5 2 4;
mso-font-charset:0;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:50331648 0 0 0 1 0;}
@font-face
{font-family:Verdana;
panose-1:0 2 11 6 4 3 5 4 4 2;
mso-font-charset:0;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:50331648 0 0 0 1 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin-right:0in;
mso-margin-top-alt:auto;
mso-margin-bottom-alt:auto;
margin-left:0in;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:Times;}
h1
{margin-right:0in;
mso-margin-top-alt:auto;
mso-margin-bottom-alt:auto;
margin-left:0in;
mso-pagination:widow-orphan;
mso-outline-level:1;
font-size:28.0pt;
font-family:Arial;
mso-font-kerning:18.0pt;
font-weight:bold;}
h2
{margin-right:0in;
mso-margin-top-alt:auto;
mso-margin-bottom-alt:auto;
margin-left:0in;
mso-line-height-alt:14.0pt;
mso-pagination:widow-orphan;
mso-outline-level:2;
font-size:18.0pt;
font-family:Arial;
font-weight:bold;}
h3
{margin-right:0in;
mso-margin-top-alt:auto;
mso-margin-bottom-alt:auto;
margin-left:0in;
mso-pagination:widow-orphan;
mso-outline-level:3;
font-size:14.0pt;
font-family:Arial;
font-weight:bold;}
a:link, span.MsoHyperlink
{color:blue;
text-decoration:underline;
text-underline:single;}
a:visited, span.MsoHyperlinkFollowed
{color:purple;
text-decoration:underline;
text-underline:single;}
p
{margin-right:0in;
mso-margin-top-alt:auto;
mso-margin-bottom-alt:auto;
margin-left:0in;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:Arial;}
code {}
pre
{margin:0in;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;
font-size:10.0pt;
font-family:"Courier New";}
table.MsoNormalTable
{mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";}
p.indextop, li.indextop, div.indextop
{mso-style-name:indextop;
margin-right:0in;
mso-margin-top-alt:auto;
mso-margin-bottom-alt:auto;
margin-left:0in;
mso-pagination:widow-orphan;
font-size:24.0pt;
font-family:Verdana;
font-weight:bold;}
p.indexsub, li.indexsub, div.indexsub
{mso-style-name:indexsub;
margin-right:0in;
mso-margin-top-alt:auto;
mso-margin-bottom-alt:auto;
margin-left:0in;
mso-pagination:widow-orphan;
font-size:7.5pt;
font-family:Arial;
color:#8080FF;}
@page Section1
{size:8.5in 11.0in;
margin:1.0in 1.25in 1.0in 1.25in;
mso-header-margin:.5in;
mso-footer-margin:.5in;
mso-paper-source:0;}
div.Section1
{page:Section1;}
-->
</style>
<!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1027"/>
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1"/>
</o:shapelayout></xml><![endif]-->
</head>
<body bgcolor=white lang=EN-US link=blue vlink=purple style='tab-interval:.5in'>
<div class=Section1>
<p class=MsoNormal>/* Font Definitions */ @font-face {font-family:&quot;Times
New Roman&quot;; panose-1:0 2 2 6 3 5 4 5 2 3; mso-font-charset:0;
mso-generic-font-family:auto; mso-font-pitch:variable;
mso-font-signature:50331648 0 0 0 1 0;} @font-face {font-family:Arial; panose-1:0
2 11 6 4 2 2 2 2 2; mso-font-charset:0; mso-generic-font-family:auto;
mso-font-pitch:variable; mso-font-signature:50331648 0 0 0 1 0;} @font-face
{font-family:&quot;Courier New&quot;; panose-1:0 2 7 3 9 2 2 5 2 4;
mso-font-charset:0; mso-generic-font-family:auto; mso-font-pitch:variable;
mso-font-signature:50331648 0 0 0 1 0;} @font-face {font-family:Verdana;
panose-1:0 2 11 6 4 3 5 4 4 2; mso-font-charset:0;
mso-generic-font-family:auto; mso-font-pitch:variable;
mso-font-signature:50331648 0 0 0 1 0;} /* Style Definitions */ p.MsoNormal,
li.MsoNormal, div.MsoNormal {mso-style-parent:&quot;&quot;; margin-right:0in;
mso-margin-top-alt:auto; mso-margin-bottom-alt:auto; margin-left:0in;
mso-pagination:widow-orphan; font-size:10.0pt; font-family:Times;} a:link,
span.MsoHyperlink {color:blue; text-decoration:underline;
text-underline:single;} a:visited, span.MsoHyperlinkFollowed {color:purple;
text-decoration:underline; text-underline:single;} p {font-size:10.0pt;
font-family:Times;} code {} pre {margin:0in; margin-bottom:.0001pt; font-size:10.0pt;
font-family:Times;} table.MsoNormalTable {mso-style-parent:&quot;&quot;;
font-size:10.0pt; font-family:&quot;Times New Roman&quot;;} p.indextop,
li.indextop, div.indextop {mso-style-name:indextop; font-size:24.0pt;
font-family:Times;} p.indexsub, li.indexsub, div.indexsub
{mso-style-name:indexsub; font-size:7.5pt; font-family:Times;} @page Section1
{size:8.5in 11.0in; margin:1.0in 1.25in 1.0in 1.25in; mso-header-margin:.5in;
mso-footer-margin:.5in; mso-paper-source:0;} div.Section1 {page:Section1;}
--&gt; </p>
<p class=MsoNormal align=right style='margin-top:0in;margin-right:0in;
margin-bottom:0in;margin-left:17.0pt;margin-bottom:.0001pt;text-align:right'><span
style='font-family:Arial'>&nbsp; </span><span style='font-family:"Times New Roman"'>©
Copyright International Business Machines Corporation, 2004. All rights
reserved</span><span style='font-family:Arial'> <o:p></o:p></span></p>
<div align=right>
<table border=0 cellspacing=0 cellpadding=0 width="100%" style='width:100.0%;
mso-cellspacing:0in;margin-left:17.0pt;mso-padding-alt:2.0pt 2.0pt 2.0pt 2.0pt'>
<tr>
<td valign=top style='background:#0080C0;padding:2.0pt 2.0pt 2.0pt 2.0pt'>
<p class=MsoNormal style='margin:0in;margin-bottom:.0001pt'><span
style='font-family:Arial;color:white'><b>&nbsp;Eclipse Corner Article</b></span><span
style='font-family:Arial'><o:p></o:p></span></p>
</td>
</tr>
</table>
</div>
<h1 style='margin-left:17.0pt'><img width=120 height=86 id="_x0000_i1025"
src="../../images/article_images/Idea.jpg" align=middle></h1>
<h1 align=center style='margin-left:17.0pt;text-align:center'><br>
Jabbering Consoles</h1>
<p class=MsoNormal style='margin-right:.5in;margin-left:53.0pt'><span
style='font-family:Arial'><b>Summary</b></span><span style='font-family:Arial'>
<br>
Traditionally, consoles are used to display output and provide input to
programs. The console plug-in in the Eclipse SDK provides a flexible framework
for building text based consoles complete with pattern matching and hyperlink
support, and also clients to provide arbitrary implementations of consoles with
custom presentations. This article showcases the console framework in Eclipse
with an example implementation of a console that supports instant messaging. <o:p></o:p></span></p>
<p style='margin-right:.5in;margin-left:53.0pt'><b>By Darin Wright, IBM
Rational Software Group<br>
Kevin Barnes, IBM Rational Software Group</b><span style='font-weight:normal'><br>
</span><span style='font-size:7.5pt'>November 5, 2004</span> <o:p></o:p></p>
<div class=MsoNormal align=center style='margin-top:0in;margin-right:0in;
margin-bottom:0in;margin-left:17.0pt;margin-bottom:.0001pt;text-align:center'><span
style='font-family:Arial'>
<hr size=2 width="100%" align=center>
</span></div>
<h2 style='margin-left:17.0pt'>Introduction</h2>
<p style='margin-left:17.0pt'>The org.eclipse.ui.console plug-in provides a
framework for building and managing consoles. A console view displays all registered
consoles. Each console is displayed by a page within the console view, and a
console may be visible in any number of console views at any given time. A
console manager maintains the currently registered set of consoles, and
provides notification when consoles are added and removed. All consoles
registered with the manager are displayed in the console view.<o:p></o:p></p>
<p style='margin-left:17.0pt'>An extensible implementation of text based
consoles is provided by the console plug-in. A text console maintains a
partitionable document supporting regular expression matching and hyperlinks.
The most general text console is used for displaying and editing a document.
For example, the Java Stack Trace Console contributed by the Java debugger is a
text console that supports pasting and navigating stack traces. The more
specialized I/O console is used to display read-only output streams and
provides an input stream that accepts input from the keyboard. For example,
when an application is launched from Eclipse, an I/O console is used to display
its standard output and error streams and provide input to its standard input
stream.<o:p></o:p></p>
<p style='margin-left:17.0pt'>[insert image: the console view]<o:p></o:p></p>
<h3 style='margin-left:17.0pt'>Basic API</b></h2>
<p style='margin-left:17.0pt'>The first thing that users think of when the
console is mention is the Console View. This view is a <span style='font-family:
"Courier New"'>PageBookView</span> that contains a page for every console
registered with the console manager. The Console View is an implementation of <span
style='font-family:"Courier New"'>IConsoleView</span> and clients may interact
with the view to manage the features provided by the view such as displaying a
specific console, pinning a console on top of other pages, and turn scroll lock
on or off. Consoles are never added directly to a Console View, instead a
Console View contains all consoles that have been added to the console manager.<o:p></o:p></p>
<p style='margin-left:17.0pt'>The console managerÂ’s API is defined by <span
style='font-family:"Courier New"'>IConsoleManager</span>, a singleton manager
class available from the <span style='font-family:"Courier New"'>ConsolePlugin</span>
class via <span style='font-family:"Courier New"'>ConsolePlugin.getDefault().getConsoleManager()</span>.
All consoleÂ’s added to a console manager will be displayed in all Console Views.<o:p></o:p></p>
<p style='margin-left:17.0pt'>Every console implements <span style='font-family:
"Courier New"'>IConsole</span>, providing a name, and an optional image and
type. The console plug-in provides an abstract base class that all console
implementations are intended to subclass - <span style='font-family:"Courier New"'>AbstractConsole</span>.
The base class provides an implementation of function common to consoles:
getters, setters, and change notification for name, image, and type attributes;
infrastructure for adding and removing property change listeners and firing
property change notification; and lifecycle methods for initialization and
cleanup (<span style='font-family:"Courier New"'>init()</span> and <span
style='font-family:"Courier New"'>dispose()</span>) that can be specialized in
subclasses. Two subclasses of AbstractConsole are also provided by the console
plugin. <span style='font-family:"Courier New"'>TextConsole</span> does
hyperlinking and regular expression pattern matching, and <span
style='font-family:"Courier New"'>IOConsole</span> which additionally provides
a document partitioner and streams for interacting with the console.<o:p></o:p></p>
<p style='margin-left:17.0pt'>The streams provided by <span style='font-family:
"Courier New"'>IOConsole</span> are regular java.io streams, but also allow you
to set some stream specific attributes such as color and font style. The <span
style='font-family:"Courier New"'>IOConsoleOutputStream</span> also allows
clients to specify whether the console should be activated when the stream is
written to.<o:p></o:p></p>
<p style='margin-left:17.0pt'>Page participants (<span style='font-family:"Courier New"'>IConsolePageParticipant</span>)
can be selectively contributed to text consoles via the <span style='font-family:
"Courier New"'>consolePageParticipants</span> extension point. A page
participant can add actions to the console tool bar and context menu, provide
adapters for the page, and implement custom function for the page. For example,
the Java Stack Trace Console previously mentioned, contributes a page
participant that adds Format and Close actions to the console tool bar.<o:p></o:p></p>
<p style='margin-left:17.0pt'>Pattern matchers can also be contributed to text
consoles selectively via the <span style='font-family:"Courier New"'>consolePatternMatchListeners</span>
extension point, or they can be programmatically added (<span style='font-family:
"Courier New"'>TextConsole.addPatternMatchListener(IPatternMatchListener)</span>).
The most common use of pattern matching is to add hyperlinks (<span
style='font-family:"Courier New"'>IHyperlink</span>) to a text console.<o:p></o:p></p>
<h2 style='margin-left:17.0pt'>Instant messaging</h2>
<p style='margin-left:17.0pt'>&lt;Overview of the parts of our example: a
console to send/receive messages and file transfer, a buddy list. Built using
Jabber/Smack.&gt;<br>
Instant messaging has become an integral part of every day communication for
many of us. Many messaging protocols and applications exist, but all share the
same basic functionality - creation of a buddy list that informs us of our
contacts availability, and ability to communicate with our buddies in real-time
when they are available. The purpose of this article is to demonstrate how a
simple instant messaging plug-in can be written quickly for Eclipse using
Eclipse consoles and the Jabber protocols. <o:p></o:p></p>
<p style='margin-left:17.0pt'>Jabber is an open set of protocols and
technologies that allow for the exchange of messages, presence, and other
structured information in close to real time. The Internet Engineering Task
Force (IETF) has formalized the core set of jabber's protocols as an approved
instant messaging and presence technology called Extensible Messaging and
Presence Protocol (XMPP). Jive Software has developed an open source XMPP
client library called Smack that we will be using to build our application.<o:p></o:p></p>
<p style='margin-left:17.0pt'>When complete, our plug-in will consist of a new
Buddy List view and will reuse existing consoles to send and receive messages.<o:p></o:p></p>
<h2 style='margin-left:17.0pt'>The Supporting cast</h2>
<p class=MsoNormal style='margin-top:0in;margin-right:0in;margin-bottom:0in;
margin-left:17.0pt;margin-bottom:.0001pt'><span style='font-family:Arial'>&lt;&gt;Before
jumping into the console itself it's necessary to spend some time discussing a
few other classes that allow us to have a functioning chat client.<br>
<br>
As with any chat application it's necessary to have a connection to a server
before any messages can be sent or received. In this plug-in it is the
ChatManager that is responsible for managing that connection. The ChatManager
is an f<br>
The central character is of course the connection to the server. Overview of
the chat manager, chat session, and buddy view<br>
Chat Manager<br>
- the brains of the operation.<br>
- Manages the connection (does the login, listens for incoming messages, and
creates chat sessions)<br style='mso-special-character:line-break'>
<![if !supportLineBreakNewLine]><br style='mso-special-character:line-break'>
<![endif]><o:p></o:p></span></p>
</>
<p style='margin-left:17.0pt'>Chat Session<br>
- creates and manages a chat console (displays messages as they are received
from other chat participants, reads from the console's input stream and sends
messages to the other participant)<o:p></o:p></p>
<p style='margin-left:17.0pt'>RosterView<br>
- I should probably just call this Buddy View for clarity. <br>
- Tree Viewer. Displays Buddy groups, buddies and their current precence.<br>
- Does it allow you to add buddies/groups? It should.<o:p></o:p></p>
<p style='margin-left:17.0pt'>Login Dialog<br>
- allows login and register. Explain register... most users probably won't have
a jabber screen name.&nbsp;&nbsp; <o:p></o:p></p>
<h2 style='margin-left:17.0pt'>The chat console</h2>
<p style='margin-left:17.0pt'>Since the purpose of this article is really to demonstrate
how the Eclipse Console Framework makes some task very simple, our chat
application is going to be console based. The framework does a few things to
make our lives easier. It provides a common view that will display all of our
consoles for us, it provides generic and reusable base implemenations of
consoles that cna be used as is, and it provides the necessary API to allow for
the creation of custom consoles. Anyone wishing to implement a Text based
console should consider using or extending the base implementions - Text
Console and IOConsole (for stream based consoles) - provided by the framework.<o:p></o:p></p>
<p style='margin-left:17.0pt'>For each chat session we'll be using an IOConsole
as is. The functionality provided by the base console is enough to do what we
require for demonstration purposed. Creating a console is simple and done by
the constructor of ChatSession:<o:p></o:p></p>
<p style='margin-left:17.0pt'>&lt;code&gt; fConsole = new IOConsole(&quot;Chat:
&quot; + fChat.getParticipant(), &quot;Chat&quot;, null); &lt;/code&gt;<o:p></o:p></p>
<p style='margin-left:17.0pt'>Adding the console to the view is done later in
the same constructor. It's as simple as adding the console to the
IConsoleManager provided by the console plugin:<br>
&lt;code&gt; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IConsoleManager consoleManager =
ConsolePlugin.getDefault().getConsoleManager();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; consoleManager.addConsoles(new
IConsole[] { fConsole });<br>
&lt;/code&gt;<o:p></o:p></p>
<p style='margin-left:17.0pt'>Every IOConsole is stream based, we can write to
the console by creating an IOConsoleOutputStream <br>
&lt;code&gt;fConsole.newOutputStream();&lt;code&gt;<br>
and using its write() methods.<o:p></o:p></p>
<p class=MsoNormal style='margin-top:0in;margin-right:0in;margin-bottom:0in;
margin-left:17.0pt;margin-bottom:.0001pt'><span style='font-family:Arial'>&lt;&gt;IOConsole
allows you to create as many IOConsoleOutputStreams as you need.It also allows
for each stream to be presented uniquely in the console with methods such as
setFontStyle(int newFontStyle), and setColor(Color color). It also allow you to
decide whether or not the ConsoleView should be &quot;activated&quot; when the
stream is used. Explain activation quickly now. For our demo we only need one
output stream, but we will change it's color to differentiated messages we send
from those that we receive. Remember that accessing you need to use the UI
thread to access system colors. The code looks like this:<br>
&lt;code&gt;<br>
final Display display = ChatPlugin.getStandardDisplay();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; display.asyncExec(new Runnable() {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void
run() {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
fIn.setColor(display.getSystemColor(SWT.COLOR_DARK_BLUE));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
out.setColor(display.getSystemColor(SWT.COLOR_DARK_RED));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
out.setActivateOnWrite(true);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fOut = new PrintStream(out); // for
convenience<br>
&lt;/code&gt;<br>
<br>
This output stream will be used to write messages that we receive to our
console, but we also want to be able to send messages. For this we'll need to
use the IOConsoleInputStream provided by the IOConsole. IOConsole only provides
one input stream via the getInputStream() method. The IOConsoleInputStream is
very similar to the related output stream. Anything that the user types into
the console will be accessible via the streams read() methods once the user
hits &quot;enter&quot;. We'll start a thread to read from the input stream, and
send each message as it's entered. Our thread will do the following.<br>
&lt;code&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int read =
0;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] bytes
= new byte[1024];<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
while (!fKilled &amp;&amp; read &gt;= 0) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
read = fIn.read(bytes);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if (read &gt; 0)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
fChat.sendMessage(new String(bytes, 0, read));<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch
(IOException e) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
e.printStackTrace();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch
(XMPPException e) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
e.printStackTrace();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; close();<br>
&lt;/code&gt;<br>
<br>
With very little code we have been able to create and display a new console
that is able to display messages from other users and respond to them.<o:p></o:p></span></p>
<h2 style='margin-left:17.0pt'>Pattern matching and hyperlinks</h2>
<p style='margin-left:17.0pt'>Use pattern matching to find URLs, add hyperlinks
for URLs, also add hyperlinks to use name for &quot;add user&quot;.<br>
Explain the console pattern matching with URL example. <br>
Walk through add user enough to show that pattern matchers can be added
programmatically.<o:p></o:p></p>
<h2 style='margin-left:17.0pt'>The page participant</h2>
<p style='margin-left:17.0pt'>Adds action for file transfer, and pattern
matching for painting a smily face<br>
- Actually does none of the above. Only adds remove console to the tool bar.<br>
- Avoid discussing command/context stuff here. Too messy. If anyone asks give
them Doug's email address and home phone number.<o:p></o:p></p>
<h2 style='margin-left:17.0pt'>The console factory</h2>
<p style='margin-left:17.0pt'>a factory to open a chat session<br>
Pretty simple stuff. screen shots and code. not too much explanation
needed. Maybe talk about other console factories??<o:p></o:p></p>
<h2 style='margin-left:17.0pt'>Other stuff?</h2>
<p style='margin-left:17.0pt'>tip: to warn of content change in a console<br>
</p>
<h2 style='margin-left:17.0pt'>Summary and further information</h2>
<p class=MsoNormal style='margin-top:0in;margin-right:0in;margin-bottom:0in;
margin-left:17.0pt;margin-bottom:.0001pt'><span style='font-family:Arial'>Stress
resusable, extensible, simple... themes Built to last and Ease of Use. Show
that we make people's lives easy.<br>
The Eclipse platform provides a very powerful framework that enables.<br>
jabber.org link for XMPP information<br>
Jive Software (Smack) http://www.jivesoftware.org/smack/<o:p></o:p></span></p>
<h2 style='margin-left:17.0pt'>Acknowledgements</h2>
<p style='margin-left:17.0pt'>Thanks to people for their careful reviews and
critiques that have improved this paper.<o:p></o:p></p>
<h2 style='margin-left:17.0pt'>Source code</h2>
<p style='margin-left:17.0pt'><img width=61 height=13 id="_x0000_i1027"
src="../../images/article_images/tryit.gif">To examine the entire source code, or to run the
example, download the <a href="pda-plugins.zip">zip file</a> and unzip it into
your Eclipse directory. The plug-in comes with complete source code. This
article describes, and the included code requires, features that are available
in Eclipse 3.1 M3 or a later version.<o:p></o:p></p>
<p style='margin-left:17.0pt'><b>Trademarks</b><span style='font-weight:normal'><o:p></o:p></span></p>
<p style='margin-left:17.0pt'>IBM and Rational are registered trademarks of
International Business Machines Corporation in the United States, other
countries, or both.<o:p></o:p></p>
<p style='margin-left:17.0pt'>Linux is a trademark of Linus Torvalds in the
United States, other countries, or both.<o:p></o:p></p>
<p style='margin-left:17.0pt'>Microsoft and Windows are trademarks of Microsoft
Corporation in the United States, other countries, or both.<o:p></o:p></p>
<p style='margin-left:17.0pt'>Java and all Java-based trademarks are trademarks
of Sun Microsystems, Inc. in the United States, other countries, or both.<o:p></o:p></p>
<p style='margin-left:17.0pt'>Other company, product, and service names may be
trademarks or service marks of others.<o:p></o:p></p>
</div>
</body>
</html>