Friday, November 04, 2005

Java hindi office suite:NoteTab

In our final year, we have to choose a project. I did this for my final year project. This basically is a simple Notepad and Internet explorer replacement, written in java. All the strings are externalised. While writing this we first wrote the program with english text in it. Then we externalised it. As I was using Eclipse this takes just one command. In Java perspective, source>externalise strings. So here are your .java files.

//NoteTab.java
/*
* Created on Dec 15, 2004
*/
package name.shabda.office;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.util.Hashtable;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.JToolBar;
import javax.swing.UIManager;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.UndoableEditEvent;
import javax.swing.event.UndoableEditListener;
import javax.swing.filechooser.FileFilter;
import javax.swing.text.DefaultEditorKit;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.JTextComponent;
import javax.swing.text.StyledEditorKit;
import javax.swing.text.rtf.RTFEditorKit;
import javax.swing.undo.CannotRedoException;
import javax.swing.undo.CannotUndoException;
import javax.swing.undo.UndoManager;

/**
* @author dicky
* This class represents a moderately lame notepad replacement.
*/
public class NoteTab extends JFrame {
JTextPane editor;//the area where you write

Hashtable actions;//stores the actions

DefaultStyledDocument doc;//document for the test area


RTFEditorKit rtf = new RTFEditorKit();

protected UndoAction undoAction;//helper for undo jobs

protected RedoAction redoAction;//helper for redo jobs

protected UndoManager undoMan = new UndoManager();

JMenuItem redo;//I need to keep these class members(not local)

JMenuItem undo;//so that undoAction & redoAction can use it

private boolean needSave;//has the status of the document changed from last
// save?

private File currentFile;//File which is currently open.Null if user is
// creating from scratch

/**
* Initialise the class.So i need to 1.add editor to write 2.add menu 3.add
* toolbar
*/
public NoteTab() {
getContentPane().setLayout(new BorderLayout());
editor = addEditor();
doc.addUndoableEditListener(new MyUndoableEditListener());
doc.addDocumentListener(new DocumentListener() {

public void insertUpdate(DocumentEvent e) {
needSave = true;//something has been inserted.I need to save.

}

public void removeUpdate(DocumentEvent e) {
needSave = true;//something has been removed.I need to save.

}

public void changedUpdate(DocumentEvent e) {
needSave = true;//something has been changed.I need to save.

}
});
JScrollPane pane = new JScrollPane(editor);
getContentPane().add(pane,BorderLayout.CENTER);
createActionTable(editor);
getContentPane().add(getAToolBar(),BorderLayout.NORTH);
setJMenuBar(addMenu());
addWindowListener(new WindowAdapter() {

public void windowClosing(WindowEvent e) {
if(!needSave) {
System.exit(0);
}else {
Object[] options = { Messages.getString("NoteTab.0"), Messages.getString("NoteTab.1"), }; //$NON-NLS-1$ //$NON-NLS-2$
int n = JOptionPane
.showOptionDialog(NoteTab.this,
Messages.getString("NoteTab.2"), //$NON-NLS-1$
Messages.getString("NoteTab.3"), //$NON-NLS-1$
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE, null, options,
options[0]);
if (n == JOptionPane.YES_OPTION) {
//User wants to save the file
save();
System.exit(0);
} else if (n == JOptionPane.NO_OPTION) {
//This file should not be saved
System.exit(0);
}
//TODO add handler for cancel event
}
}
});
}

/**
* I need to add a menu to this frame.
*/
public JMenuBar addMenu() {
JMenuBar theMenu = new JMenuBar();
JMenu file = new JMenu(Messages.getString("NoteTab.4")); //$NON-NLS-1$
JMenuItem new1 = new JMenuItem(Messages.getString("NoteTab.5")); //$NON-NLS-1$
JMenuItem save = new JMenuItem(Messages.getString("NoteTab.6")); //$NON-NLS-1$
JMenuItem saveAs=new JMenuItem(Messages.getString("NoteTab.53")); //$NON-NLS-1$
JMenuItem open = new JMenuItem(Messages.getString("NoteTab.7")); //$NON-NLS-1$
JMenuItem print = new JMenuItem(Messages.getString("NoteTab.8")); //$NON-NLS-1$
new1.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {
if (!needSave) {//dont need a save.go ahead.
newDoc();
} else {//You need to save the current document before
// proceeding
Object[] options = { Messages.getString("NoteTab.9"), Messages.getString("NoteTab.10"), Messages.getString("NoteTab.11") }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
int n = JOptionPane.showOptionDialog(NoteTab.this,
Messages.getString("NoteTab.12"), //$NON-NLS-1$
Messages.getString("NoteTab.13"), //$NON-NLS-1$
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE, null, options,
options[0]);
if (n == JOptionPane.YES_OPTION) {
//User wants to save the file
save();
newDoc();
} else if (n == JOptionPane.NO_OPTION) {
//This file should not be saved
newDoc();
} else if (n == JOptionPane.CLOSED_OPTION
|| n == JOptionPane.CANCEL_OPTION) {
//user has not made up his mind.dont do any thing.
}

}

}
});
save.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {
if (currentFile != null)//there is current file, so save to it.
{
save();
} else {//no current file. I need to ask the user for location
saveAs();
}
}
});
saveAs.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

saveAs();
}
});
open.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {
if (!needSave) {//dont need a save.go ahead.
open();
} else {//You need to save the current document before
// proceeding
Object[] options = { Messages.getString("NoteTab.14"), Messages.getString("NoteTab.15"), Messages.getString("NoteTab.16") }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
int n = JOptionPane.showOptionDialog(NoteTab.this,
Messages.getString("NoteTab.17"), //$NON-NLS-1$
Messages.getString("NoteTab.18"), //$NON-NLS-1$
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE, null, options,
options[0]);
if (n == JOptionPane.YES_OPTION) {
//User wants to save the file
save();
open();
} else if (n == JOptionPane.NO_OPTION) {
//This file should not be saved
open();
} else if (n == JOptionPane.CLOSED_OPTION
|| n == JOptionPane.CANCEL_OPTION) {
//user has not made up his mind.dont do any thing.
}

}

}
});
file.add(new1);
file.add(save);
file.add(saveAs);
file.add(open);
file.add(print);
theMenu.add(file);
JMenu edit = new JMenu(Messages.getString("NoteTab.19")); //$NON-NLS-1$
JMenuItem cut = new JMenuItem(Messages.getString("NoteTab.20")); //$NON-NLS-1$
cut.addActionListener(getActionByName(DefaultEditorKit.cutAction));
JMenuItem copy = new JMenuItem(Messages.getString("NoteTab.21")); //$NON-NLS-1$
copy.addActionListener(getActionByName(DefaultEditorKit.copyAction));
JMenuItem paste = new JMenuItem(Messages.getString("NoteTab.22")); //$NON-NLS-1$
paste.addActionListener(getActionByName(DefaultEditorKit.pasteAction));
JMenuItem selectAll = new JMenuItem(Messages.getString("NoteTab.23")); //$NON-NLS-1$
selectAll
.addActionListener(getActionByName(DefaultEditorKit.selectAllAction));
undo = new JMenuItem(Messages.getString("NoteTab.24")); //$NON-NLS-1$
undoAction = new UndoAction();
undo.addActionListener(undoAction);
redo = new JMenuItem(Messages.getString("NoteTab.25")); //$NON-NLS-1$
redoAction = new RedoAction();
redo.addActionListener(redoAction);
edit.add(cut);
edit.add(copy);
edit.add(paste);
edit.add(selectAll);
edit.add(undo);
edit.add(redo);
theMenu.add(edit);
JMenu format = new JMenu(Messages.getString("NoteTab.26")); //$NON-NLS-1$
JMenuItem red = new JMenuItem(Messages.getString("NoteTab.27")); //$NON-NLS-1$
JMenuItem black = new JMenuItem(Messages.getString("NoteTab.28")); //$NON-NLS-1$
JMenuItem blue = new JMenuItem(Messages.getString("NoteTab.29")); //$NON-NLS-1$
JMenu fonts=new JMenu(Messages.getString("NoteTab.30")); //$NON-NLS-1$
JMenuItem bigFont=new JMenuItem(Messages.getString("NoteTab.31")); //$NON-NLS-1$
JMenuItem mediumFont=new JMenuItem(Messages.getString("NoteTab.32")); //$NON-NLS-1$
JMenuItem smallFont=new JMenuItem(Messages.getString("NoteTab.33")); //$NON-NLS-1$
fonts.add(bigFont);
fonts.add(mediumFont);
fonts.add(smallFont);
JMenu style=new JMenu(Messages.getString("NoteTab.34")); //$NON-NLS-1$
JMenuItem bold=new JMenuItem(Messages.getString("NoteTab.35")); //$NON-NLS-1$
JMenuItem underLine=new JMenuItem(Messages.getString("NoteTab.36")); //$NON-NLS-1$
JMenuItem italics=new JMenuItem(Messages.getString("NoteTab.37")); //$NON-NLS-1$
style.add(bold);
style.add(underLine);
style.add(italics);
format.add(red);
format.add(black);
format.add(blue);
format.add(fonts);
format.add(style);
red.addActionListener(new StyledEditorKit.ForegroundAction(Messages.getString("NoteTab.38"), //$NON-NLS-1$
Color.red));
black.addActionListener(new StyledEditorKit.ForegroundAction(Messages.getString("NoteTab.39"), //$NON-NLS-1$
Color.black));
blue.addActionListener(new StyledEditorKit.ForegroundAction(Messages.getString("NoteTab.40"), //$NON-NLS-1$
Color.blue));
bigFont.addActionListener(new StyledEditorKit.FontSizeAction(Messages.getString("NoteTab.41"),20)); //$NON-NLS-1$
bigFont.addActionListener(new StyledEditorKit.FontSizeAction(Messages.getString("NoteTab.42"),15)); //$NON-NLS-1$
smallFont.addActionListener(new StyledEditorKit.FontSizeAction(Messages.getString("NoteTab.43"),10)); //$NON-NLS-1$
bold.addActionListener(new StyledEditorKit.BoldAction());
underLine.addActionListener(new StyledEditorKit.UnderlineAction());
italics.addActionListener(new StyledEditorKit.ItalicAction());
theMenu.add(format);
JMenu help = new JMenu(Messages.getString("NoteTab.44")); //$NON-NLS-1$
theMenu.add(help);
return theMenu;

}

public JToolBar getAToolBar() {
JToolBar tools=new JToolBar();
JButton newDoc=new JButton(); //$NON-NLS-1$
ImageIcon ii=createImageIcon("../images/new.gif", null); //$NON-NLS-1$
newDoc.setIcon(ii);
JButton save=new JButton(); //$NON-NLS-1$
ii=createImageIcon("../images/save.gif", null); //$NON-NLS-1$
save.setIcon(ii);
JButton open=new JButton(); //$NON-NLS-1$
ii=createImageIcon("../images/open.gif", null); //$NON-NLS-1$
open.setIcon(ii);
JButton cut=new JButton(); //$NON-NLS-1$
ii=createImageIcon("../images/cut.gif", null); //$NON-NLS-1$
cut.setIcon(ii);
JButton copy=new JButton(); //$NON-NLS-1$
ii=createImageIcon("../images/copy.gif", null);
copy.setIcon(ii);
JButton paste=new JButton(); //$NON-NLS-1$
ii=createImageIcon("../images/paste.gif", null);
paste.setIcon(ii);
newDoc.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (!needSave) {//dont need a save.go ahead.
newDoc();
} else {//You need to save the current document before
// proceeding
Object[] options = { Messages.getString("NoteTab.9"), Messages.getString("NoteTab.10"), Messages.getString("NoteTab.11") }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
int n = JOptionPane.showOptionDialog(NoteTab.this,
Messages.getString("NoteTab.12"), //$NON-NLS-1$
Messages.getString("NoteTab.13"), //$NON-NLS-1$
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE, null, options,
options[0]);
if (n == JOptionPane.YES_OPTION) {
//User wants to save the file
save();
newDoc();
} else if (n == JOptionPane.NO_OPTION) {
//This file should not be saved
newDoc();
} else if (n == JOptionPane.CLOSED_OPTION
|| n == JOptionPane.CANCEL_OPTION) {
//user has not made up his mind.dont do any thing.
}

}

}
});
save.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {
if (currentFile != null)//there is current file, so save to it.
{
save();
} else {//no current file. I need to ask the user for location
saveAs();
}
}
});
open.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {
if (!needSave) {//dont need a save.go ahead.
open();
} else {//You need to save the current document before
// proceeding
Object[] options = { Messages.getString("NoteTab.14"), Messages.getString("NoteTab.15"), Messages.getString("NoteTab.16") }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
int n = JOptionPane.showOptionDialog(NoteTab.this,
Messages.getString("NoteTab.17"), //$NON-NLS-1$
Messages.getString("NoteTab.18"), //$NON-NLS-1$
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE, null, options,
options[0]);
if (n == JOptionPane.YES_OPTION) {
//User wants to save the file
save();
open();
} else if (n == JOptionPane.NO_OPTION) {
//This file should not be saved
open();
} else if (n == JOptionPane.CLOSED_OPTION
|| n == JOptionPane.CANCEL_OPTION) {
//user has not made up his mind.dont do any thing.
}

}

}
});

cut.addActionListener(getActionByName(DefaultEditorKit.cutAction));
copy.addActionListener(getActionByName(DefaultEditorKit.copyAction));
paste.addActionListener(getActionByName(DefaultEditorKit.pasteAction));
tools.add(newDoc);
tools.add(save);
tools.add(open);
tools.addSeparator();
tools.add(cut);
tools.add(copy);
tools.add(paste);
tools.addSeparator();
return tools;
}

/**
* save the file Get file where we want to save the data from the user.
*/
public void saveAs() {
JFileChooser fc = new JFileChooser();
fc.addChoosableFileFilter(new FileFilter() {

public boolean accept(File f) {
if (f.isDirectory()) {
return true;
}

String extension = getExtension(f);
if (extension != null) {
if (extension.equals("rtf")) {
return true;
} else {
return false;
}
}

return false;
}

public String getDescription() {
return "Rich Text Format(Hindi) Files";

}});
int returnVal = fc.showSaveDialog(NoteTab.this);//this is tricky.I dont
// understand it but..
if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
try {
FileOutputStream out = new FileOutputStream(file);
rtf.write(out, doc, 0, doc.getLength());
needSave = false;//have saved.no need to save it donot edit
} catch (Exception ee) {
System.out.println(Messages.getString("NoteTab.45")); //$NON-NLS-1$
ee.printStackTrace();
}

}
}

/**
* save the file in current file.
*/
public void save() {
if (currentFile != null) {//Current file is not null. Can save without
// bothering user
try {
FileOutputStream out = new FileOutputStream(currentFile);
rtf.write(out, doc, 0, doc.getLength());
needSave = false;//have saved.no need to save it donot edit
} catch (Exception ee) {
System.out.println(Messages.getString("NoteTab.46")); //$NON-NLS-1$
ee.printStackTrace();
}
}

else
saveAs();//Current file is null. I have to ask the user the correct
// place.
}

/**
* open a file.
* Warning! This doesnot check if a save is needed.This
* resposiblity is upto you.
*/
public void open() {
JFileChooser fc = new JFileChooser();
fc.addChoosableFileFilter(new FileFilter() {

public boolean accept(File f) {
if (f.isDirectory()) {
return true;
}

String extension = getExtension(f);
if (extension != null) {
if (extension.equals("rtf")) {
return true;
} else {
return false;
}
}

return false;
}

public String getDescription() {
return "Rich Text Format(Hindi) Files";

}});
int returnVal = fc.showOpenDialog(NoteTab.this);//this is tricky.I dont
// understand it but..
if (returnVal == JFileChooser.APPROVE_OPTION) {
editor.setText(Messages.getString("NoteTab.47"));//need to show a new file.So clear the screen. //$NON-NLS-1$
File file = fc.getSelectedFile();
currentFile = file;
try {
FileReader in = new FileReader(file);
rtf.read(in, doc, 0);
} catch (Exception ee) {
}
needSave = false;//just opened a file. No need to save now.
}
}

/**
* this creates a new document to write on. As always we donot check if a
* save is needed This job is left for the caller.
*/
public void newDoc() {
editor.setText(Messages.getString("NoteTab.48"));//clear the editor //$NON-NLS-1$
currentFile = null;//new document.No current file.
needSave = false;
}

/**
* Get a editor for the frame
*/
public JTextPane addEditor() {
//doc=new RTFStyledDocument();
doc = new DefaultStyledDocument();
JTextPane pane = new JTextPane(doc);
pane.setPreferredSize(new Dimension(600, 400));
return pane;
}

/**
* Create a hashTable from the actions supported by this component
*/
private void createActionTable(JTextComponent textComponent) {
actions = new Hashtable();
Action[] actionsArray = textComponent.getActions();
for (int i = 0; i < actionsArray.length; i++) {
Action a = actionsArray[i];
actions.put(a.getValue(Action.NAME), a);
}
}

private Action getActionByName(String name) {
return (Action) (actions.get(name));
}

class UndoAction extends AbstractAction {
public UndoAction() {
super(Messages.getString("NoteTab.49")); //$NON-NLS-1$
undo.setEnabled(false);
}

public void actionPerformed(ActionEvent e) {
try {
undoMan.undo();
} catch (CannotUndoException ex) {
System.out.println(Messages.getString("NoteTab.50") + ex); //$NON-NLS-1$
ex.printStackTrace();
}
updateUndoState();
redoAction.updateRedoState();
}

protected void updateUndoState() {
if (undoMan.canUndo()) {
undo.setEnabled(true);
} else {
undo.setEnabled(false);
}
}
}

class RedoAction extends AbstractAction {
public RedoAction() {
super(Messages.getString("NoteTab.51")); //$NON-NLS-1$
redo.setEnabled(false);
}

public void actionPerformed(ActionEvent e) {
try {
undoMan.redo();
} catch (CannotRedoException ex) {
System.out.println(Messages.getString("NoteTab.52") + ex); //$NON-NLS-1$
ex.printStackTrace();
}
updateRedoState();
undoAction.updateUndoState();
}

protected void updateRedoState() {
if (undoMan.canRedo()) {
redo.setEnabled(true);
} else {
redo.setEnabled(false);
}
}
}

/*
* (non-Javadoc)
*
* @see java.awt.Window#addWindowListener(java.awt.event.WindowListener)
*/

protected class MyUndoableEditListener implements UndoableEditListener {
public void undoableEditHappened(UndoableEditEvent e) {
//Remember the edit and update the menus.
undoMan.addEdit(e.getEdit());
undoAction.updateUndoState();
redoAction.updateRedoState();
}
}
/**
* Create a imageIcon by getting a relative link
* */
protected static ImageIcon createImageIcon(String path,
String description) {
java.net.URL imgURL = NoteTab.class.getResource(path);
if (imgURL != null) {
return new ImageIcon(imgURL, description);
} else {
System.err.println("Couldn't find file: " + path);
return null;
}
}

/**
* Get the file extension from that file
* */
public static String getExtension(File f) {
String ext = null;
String s = f.getName();
int i = s.lastIndexOf('.');

if (i > 0 && i < s.length() - 1) {
ext = s.substring(i+1).toLowerCase();
}
return ext;
}
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
} catch (Exception e) {
}

NoteTab app = new NoteTab();
app.pack();
app.show();
}
}

But you need two more files to compile it. A Messages.java file is needed to get the strings and messages.properties is needed to keep the actual localised strings. So here is your Messages.java file

//Messages.java
/*
* Created on Dec 16, 2004
*/
package name.shabda.office;

import java.util.MissingResourceException;
import java.util.ResourceBundle;

/**
* @author dicky
*/
public class Messages {
private static final String BUNDLE_NAME = "name.shabda.office.messages";//$NON-NLS-1$

private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
.getBundle(BUNDLE_NAME);

private Messages() {
}

public static String getString(String key) {
// TODO Auto-generated method stub
try {
return RESOURCE_BUNDLE.getString(key);
} catch (MissingResourceException e) {
return '!' + key + '!';
}
}
}
And the messages.properties file is localised to display the hindi strings.
Some text which are for debugging are not localised.

NoteTab.0=\u0939\u093e\u0901
NoteTab.1=\u0928\u0939\u0940\u0902
NoteTab.2=\u0906\u092a\u0915\u0940 \u090f\u0915 \u095e\u093e\u0907\u0932 \u091c\u092e\u093e \u0928\u0939\u0940\u0902 \u0939\u0948\u0964 \u0915\u094d\u092f\u093e \u0909\u0938\u0947 \u091c\u092e\u093e \u0915\u0930 \u0926\u0942\u0901 ?\n
NoteTab.3=File not saved!
NoteTab.4=\u095e\u093e\u0907\u0932
NoteTab.5=\u0928\u092f\u093e
NoteTab.6=\u091c\u092e\u093e \u0915\u0930\u094b
NoteTab.7=\u0916\u094b\u0932\u094b
NoteTab.8=\u091b\u093e\u092a\u094b
NoteTab.9=\u0939\u093e\u0901
NoteTab.10=\u0928\u0939\u0940\u0902
NoteTab.11=Cancel
NoteTab.12=\u0906\u092a\u0915\u0940 \u090f\u0915 \u095e\u093e\u0907\u0932 \u091c\u092e\u093e \u0928\u0939\u0940\u0902 \u0939\u0948\u0964 \u0915\u094d\u092f\u093e \u0909\u0938\u0947 \u091c\u092e\u093e \u0915\u0930 \u0926\u0942\u0901 ?\n
NoteTab.13=File not saved!
NoteTab.14=\u0939\u093e\u0901
NoteTab.15=\u0928\u0939\u0940\u0902
NoteTab.16=Cancel
NoteTab.17=\u0906\u092a\u0915\u0940 \u090f\u0915 \u095e\u093e\u0907\u0932 \u091c\u092e\u093e \u0928\u0939\u0940\u0902 \u0939\u0948\u0964 \u0915\u094d\u092f\u093e \u0909\u0938\u0947 \u091c\u092e\u093e \u0915\u0930 \u0926\u0942\u0901 ?\n
NoteTab.18=File not saved!
NoteTab.19=\u090f\u0921\u093f\u091f
NoteTab.20=\u0915\u093e\u091f\u094b
NoteTab.21=\u0928\u0915\u0932 \u0915\u0930\u094b
NoteTab.22=\u091a\u093f\u092a\u0915\u093e\u0913
NoteTab.23=\u0938\u092c\u0915\u094b \u091a\u0941\u0928\u094b
NoteTab.24=\u0935\u093e\u092a\u0938 \u0915\u0930\u094b
NoteTab.25=\u095e\u093f\u0930 \u0938\u0947 \u0915\u0930\u094b
NoteTab.26=\u095e\u094b\u0930\u094d\u092e\u0948\u091f
NoteTab.27=\u0932\u093e\u0932
NoteTab.28=\u0915\u093e\u0932\u093e
NoteTab.29=\u0928\u0940\u0932\u093e
NoteTab.30=\u0906\u0915\u093e\u0930
NoteTab.31=\u092c\u0921\u093e
NoteTab.32=\u092e\u0927\u094d\u092f\u092e
NoteTab.33=\u091b\u094b\u091f\u093e
NoteTab.34=\u0938\u094d\u091f\u093e\u0907\u0932
NoteTab.35=\u092e\u094b\u091f\u093e
NoteTab.36=\u0928\u0940\u091a\u0947 \u0932\u093e\u0907\u0928
NoteTab.37=\u0924\u093f\u0930\u091b\u093e
NoteTab.38=Red
NoteTab.39=Black
NoteTab.40=Blue
NoteTab.41=
NoteTab.42=
NoteTab.43=
NoteTab.44=\u092e\u0926\u0926
NoteTab.45=exeption\!
NoteTab.46=exeption\!
NoteTab.47=
NoteTab.48=
NoteTab.49=Undo
NoteTab.50=Unable to undo:
NoteTab.51=Redo
NoteTab.52=Unable to redo:
NoteTab.53=\u092f\u0939\u093e\u0901 \u091c\u092e\u093e \u0915\u0930\u094b
NoteTab.54=paste.gif
IE.2=\u0918\u0942\u092e\u094b
IE.3=\u0935\u093e\u092a\u0938 \u091c\u093e\u0913
IE.4=\u0906\u0917\u0947 \u091c\u093e\u0913
IE.5=\u0918\u0930 \u091c\u093e\u0913
PaintIt.12=About
PaintIt.14=\u092c\u0929\u094d\u0926
PaintIt.16=\u0930\u0929\u094d\u0917
PaintIt.17=\u0914\u091c\u093e\u0930
PaintIt.18=\u092f\u0902\u0924\u094d\u0930
PaintIt.19=\u092f\u0902\u0924\u094d\u0930

Next we will look at the Explorer replacement.

1 Comments:

Blogger Unknown said...

can u upload the synopsis of office suite written in java with everything in detail explanation.....
it would be grateful.....

7:41 AM  

Post a Comment

<< Home