/*--------------------------------------------------
* SharedClipBoard.java
*
* A List component that can show one of two
* textboxes. Each textbox shares a common clipboard
*
* Example from the book: Core J2ME Technology
* Copyright John W. Muchow http://www.CoreJ2ME.com
* You may use/modify for any non-commercial purpose
*-------------------------------------------------*/
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class SharedClipBoard extends MIDlet implements CommandListener
{
private Display display; // Reference to Display object
private List lsMain; // Main list
private TextBoxCB tbClip1; // Textbox with clipboard
private TextBoxCB tbClip2; // Textbox with clipboard
private Command cmExit; // Command to exit
public SharedClipBoard()
{
display = Display.getDisplay(this);
// Create list
lsMain = new List("ClipBoard Testing", List.IMPLICIT);
lsMain.append("TextBox1", null);
lsMain.append("TextBox2", null);
// Create the exit command, add to list
cmExit = new Command("Exit", Command.EXIT, 1);
lsMain.addCommand(cmExit);
lsMain.setCommandListener(this);
// Allocate textboxes
tbClip1 = new TextBoxCB("TextBox1", "Email Address: john@corej2me.com", 50, TextField.ANY, this);
tbClip2 = new TextBoxCB("TextBox2", "Web Address: www.", 50, TextField.ANY, this);
}
public void startApp()
{
showList();
}
public void pauseApp()
{
}
public void destroyApp(boolean unconditional)
{
}
public void showList()
{
// Display the list component
display.setCurrent(lsMain);
}
public void commandAction(Command c, Displayable s)
{
// If an implicit list generated the event
if (c == List.SELECT_COMMAND)
{
switch (lsMain.getSelectedIndex())
{
case 0:
// Display textbox 1
display.setCurrent(tbClip1);
break;
case 1:
// Display textbox 2
display.setCurrent(tbClip2);
break;
}
}
else if (c == cmExit)
{
destroyApp(false);
notifyDestroyed();
}
}
}
/*--------------------------------------------------
* TextBoxCB.java
*
* A textbox that includes a clipboard. This class
* encapsulates all the commands necessary to show
* a menu for mark, copy, cut and paste.
*
* Example from the book: Core J2ME Technology
* Copyright John W. Muchow http://www.CoreJ2ME.com
* You may use/modify for any non-commercial purpose
*-------------------------------------------------*/
class TextBoxCB extends TextBox implements CommandListener
{
private ClipBoard clipboard; // The clipboard class
private Command cmBack; // Command to go back
private Command cmStartMark; // Command to start marking a block
private Command cmCopy; // Command to copy to clipboard
private Command cmCut; // Command to cut to clipboard
private Command cmPaste; // Command to paste into textbox
private SharedClipBoard midlet; // The midlet
public TextBoxCB(String title, String text, int maxSize, int constraints,
SharedClipBoard midlet)
{
// Call the TextBox constructor
super(title, text, maxSize, constraints);
// Save reference to MIDlet so we can access its methods
this.midlet = midlet;
// Create the Commands. Notice the priorities assigned
cmBack = new Command("Back", Command.BACK, 1);
cmStartMark = new Command("Mark", Command.SCREEN, 2);
cmCopy = new Command("Copy", Command.SCREEN, 3);
cmCut = new Command("Cut", Command.SCREEN, 4);
cmPaste = new Command("Paste", Command.SCREEN, 5);
this.addCommand(cmBack);
this.addCommand(cmStartMark);
this.addCommand(cmCopy);
this.addCommand(cmCut);
this.addCommand(cmPaste);
this.setCommandListener(this);
// Create a clipboard
clipboard = new ClipBoard(this);
}
public void commandAction(Command c, Displayable s)
{
if (c == cmStartMark)
{
// Start to mark a block of text
clipboard.startMark();
}
else if (c == cmCopy)
{
// Copy text to clipboard
clipboard.copy();
}
else if (c == cmCut)
{
// Cut text to clipboard
clipboard.cut();
}
else if (c == cmPaste)
{
// Paste from clipboard to textbox
clipboard.paste();
}
else if (c == cmBack)
{
// Return to the list component
midlet.showList();
}
}
}
/*--------------------------------------------------
* ClipBoard.java
*
* Core clipboard code - mark, copy, cut and paste
*
* Example from the book: Core J2ME Technology
* Copyright John W. Muchow http://www.CoreJ2ME.com
* You may use/modify for any non-commercial purpose
*-------------------------------------------------*/
class ClipBoard
{
//--------------------------------------------------
// Allocate clipboard. Note, both clipboard & count
// of characters are shared across all instances
//--------------------------------------------------
private static char[] _clipBoard = new char[1000];
private static int _clipBoardCount = 0;
private int beginOffset = 0; // The start index of copy
private TextBox tb = null; // textbox for this instance
/*--------------------------------------------------
* Hold reference to textbox that created clipboard
*-------------------------------------------------*/
public ClipBoard(TextBox textbox)
{
tb = textbox;
}
/*--------------------------------------------------
* Set starting point of copy
*-------------------------------------------------*/
public void startMark()
{
beginOffset = tb.getCaretPosition();
}
/*--------------------------------------------------
* Copy text into the clipboard
*-------------------------------------------------*/
public void copy()
{
copy2clipboard();
}
/*--------------------------------------------------
* Copy text into the clipboard. If successful copy,
* delete text from the textbox.
*-------------------------------------------------*/
public void cut()
{
if (copy2clipboard())
tb.delete(beginOffset, tb.getCaretPosition() - beginOffset);
}
/*--------------------------------------------------
* Do the actual copy into the clipboard
*-------------------------------------------------*/
private boolean copy2clipboard()
{
// Can only mark (copy/cut) going forward
if (tb.getCaretPosition() > beginOffset)
{
// Allocate an array to hold the current textbox contents
char[] chr = new char[tb.size()];
// Get the current textbox contents
tb.getChars(chr);
// The count of characters in the clipboard
_clipBoardCount = tb.getCaretPosition() - beginOffset;
// Copy the text into the clipboard
// arraycopy(source, sourceindex, dest, destindex, count)
System.arraycopy(chr, beginOffset, _clipBoard, 0, _clipBoardCount);
return true;
}
else
return false;
}
/*--------------------------------------------------
* Paste text from clipboard into the textbox
*-------------------------------------------------*/
public void paste()
{
// Make sure the paste will not overrun the textbox length
if ((tb.size() + _clipBoardCount) <= tb.getMaxSize())
tb.insert(_clipBoard, 0, _clipBoardCount, tb.getCaretPosition());
}
}
|