Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsWhite Papers
Discussion GroupsFirst AidDatabasesJavaBeansGUIJava 3DVirtual MachineCORBASecurityToolsGeneral
Java DirectoryOpen Source ProjectsSample Book ChaptersUser GroupsWeb Resources
Related Topics
Databases.NETMore Topics ...

Java Forum / GUI / December 2003

Tip: Looking for answers? Try searching our database.

Reusing JFileChooser instances

Thread view: 
Mike Conmackie - 28 Dec 2003 01:19 GMT
I am trying to serially reuse a single instance of JfileChooser but
the second and subsequent uses of the instance continue returning the
selected item from the first use (via getSelectedFile() ).  I have
tried using setSelectedFile(null) to no avail.  Can anyone tell me how
to reset the selection state?  Thanks.
Andrew Thompson - 28 Dec 2003 10:12 GMT
> I am trying to serially reuse a single instance of JfileChooser but
> the second and subsequent uses of the instance continue returning the
> selected item from the first use (via getSelectedFile() ).  I have
> tried using setSelectedFile(null) to no avail.  Can anyone tell me how
> to reset the selection state?  Thanks.

I might be able to tell you what is wrong
with your code, if you'd supplied it.

SSCCE.

--
Andrew Thompson
* http://www.PhySci.org/ PhySci software suite
* http://www.1point1C.org/ 1.1C - Superluminal!
* http://www.AThompson.info/andrew/ personal site
Mike Conmackie - 28 Dec 2003 17:08 GMT
Sorry, here is the relevant code ...

public class DiabloBackupRestore
   extends JFrame {

 private Container container;
 private ImageIcon backgroundImage;
 private JPanel backgroundpanel;
 private JButton backupButton, restoreButton, browseButton;
 private JDialog dialog;
 private JLabel savepathLabel, characterLabel, backuppathLabel;
 private JTextField savepathField, backuppathField;
 private JList characterList;
 private JLabel label1,label2, label3;
 private JTextField textfield1, textfield2;
 private JList list1;
 private JButton button1, button2, button3, button4;
 private JFileChooser fileChooser;
 private File saveFolder, backupFolder;

 public DiabloBackupRestore() {
   super("Diablo Backup & Restore");
   container = getContentPane();
   container.setLayout(new BoxLayout(container, BoxLayout.X_AXIS));
   container.add(Box.createHorizontalGlue());
   ButtonHandler handler = new ButtonHandler();
   backupButton = new JButton("Backup");
   backupButton.setToolTipText("Copy character file(s) to another
location");
   backupButton.addActionListener(handler);
   container.add(backupButton);
   container.add(Box.createHorizontalGlue());
   restoreButton = new JButton("Restore");
   restoreButton.setToolTipText(
       "Copy character file(s) to Diablo II save folder");
   restoreButton.addActionListener(handler);
   container.add(restoreButton);
   container.add(Box.createHorizontalGlue());
   setResizable(false);
   ((JPanel) container).setOpaque(false);
   ImageIcon background = new ImageIcon("background.jpg");
   JLabel label = new JLabel(background);
   getLayeredPane().add(label, new Integer(Integer.MIN_VALUE));
   int width = background.getIconWidth();
   int height = background.getIconHeight();
   label.setBounds(0, 0, width, height);
   dialog = new JDialog(this, false);
   fileChooser = new JFileChooser();
   setSize(width, height);
   setVisible(true);
 }

 private class ButtonHandler
     implements ActionListener {

   public void actionPerformed(ActionEvent e) {
     if (e.getSource() == backupButton) {
       showBackupDialog();
     }
     else if (e.getSource() == restoreButton) {
       showRestoreDialog();
     }
   }
 }

 private class DialogButtonHandler
     implements ActionListener {

   public void actionPerformed(ActionEvent e) {
     if (e.getSource() == button1) {
       selectSavedGamePath();
     }
     else if (e.getSource() == button2) {
       selectBackupPath();
     }
   }
 }

 private void showBackupDialog() {

   Container container;

   label1 = new JLabel("Saved games path", SwingConstants.RIGHT);
   label2 = new JLabel("Backup path", SwingConstants.RIGHT);
   label3 = new JLabel("Character", SwingConstants.RIGHT);
   textfield1 = new JTextField(10);
   textfield2 = new JTextField(10);
   list1 = new JList();
   list1.setVisibleRowCount(3);
   list1.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
   //  button1 and button2 activate a JFileChooser
   button1 = new JButton("Browse...");
   DialogButtonHandler dialogButtonHandler = new DialogButtonHandler();
   button1.addActionListener(dialogButtonHandler);
   button2 = new JButton("Browse...");
   button2.addActionListener(dialogButtonHandler);
   button3 = new JButton("Ok");
   button4 = new JButton("Cancel");
   button3.setPreferredSize(button4.getPreferredSize());
   DialogButtonHandler handler = new DialogButtonHandler();
   container = dialog.getContentPane();
   container.removeAll();
   container.setLayout( new GridBagLayout());
   GridBagConstraints c = new GridBagConstraints();
   c.insets = new Insets(4, 4, 4, 4);
   c.weightx = 1.0;
   c.weighty = 1.0;
   c.gridx = 0;
   c.gridy = 0;
   c.gridwidth = 2;
   c.gridheight = 1;
   c.fill = GridBagConstraints.HORIZONTAL;
   container.add(label1, c);
   c.gridx = 2;
   container.add(textfield1, c);
   c.gridx = 4;
   c.gridwidth = 1;
   c.fill = GridBagConstraints.NONE;
   c.anchor = GridBagConstraints.WEST;
   container.add(button1, c);
   c.gridx = 0;
   c.gridy = 1;
   c.gridwidth = 2;
   c.fill = GridBagConstraints.HORIZONTAL;
   c.anchor = GridBagConstraints.CENTER;
   container.add(label2, c);
   c.gridx = 2;
   container.add(textfield2, c);
   c.gridx = 4;
   c.gridwidth = 1;
   c.fill = GridBagConstraints.NONE;
   c.anchor = GridBagConstraints.WEST;
   container.add(button2, c);
   c.gridx = 0;
   c.gridy = 2;
   c.gridwidth = 2;
   c.fill = GridBagConstraints.HORIZONTAL;
   c.anchor = GridBagConstraints.CENTER;
   container.add(label3, c);
   c.gridx = 2;
   container.add(list1, c);
   c.gridx = 3;
   c.gridy = 4;
   c.gridwidth = 1;
   c.fill = GridBagConstraints.NONE;
   c.anchor = GridBagConstraints.EAST;
   container.add(button3, c);
   c.gridx = 4;
   c.anchor = GridBagConstraints.WEST;
   container.add(button4, c);
   dialog.setTitle("Backup Diablo II Character");
   dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
   // container.setBackground(Color.RED);
   dialog.setSize(300, 200);
   dialog.show();

 }

 private void showRestoreDialog() {

   Container container;
   container = dialog.getContentPane();
   container.removeAll();
   dialog.setTitle("Restore Diablo II Character");
   dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
   dialog.setSize(300, 200);
   dialog.show();
 }

 private void selectSavedGamePath() {
   fileChooser.setDialogTitle("Select saved game(s) folder");
   fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
   fileChooser.setCurrentDirectory(new File("C:\\"));
   fileChooser.setSelectedFile(null);
   int result = fileChooser.showOpenDialog(dialog);
   if (result == JFileChooser.APPROVE_OPTION) {
     saveFolder = fileChooser.getSelectedFile();
     textfield1.setText(saveFolder.getAbsolutePath());
   }
 }

 private void selectBackupPath() {
   fileChooser.setDialogTitle("Select backup folder");
   fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
   fileChooser.setCurrentDirectory(new File("C:\\"));
   fileChooser.setSelectedFile(null);
   int result = fileChooser.showOpenDialog(dialog);
   if (result == JFileChooser.APPROVE_OPTION) {
     backupFolder = fileChooser.getSelectedFile();
     textfield2.setText(saveFolder.getAbsolutePath());
   }

 }

 public static void main(String[] args) {
   try {
     UIManager.setLookAndFeel(
         "com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
   }
   catch (UnsupportedLookAndFeelException ex) {
     System.out.println("Unable to load Windows look and feel " + ex);
   }
   catch (IllegalAccessException ex) {
     System.out.println("Unable to load Windows look and feel " + ex);
   }
   catch (InstantiationException ex) {
     System.out.println("Unable to load Windows look and feel " + ex);
   }
   catch (ClassNotFoundException ex) {
     System.out.println("Unable to load Windows look and feel " + ex);
   }
   DiabloBackupRestore application = new DiabloBackupRestore();
   application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 }
}

> > I am trying to serially reuse a single instance of JfileChooser but
> > the second and subsequent uses of the instance continue returning the
[quoted text clipped - 12 lines]
> * http://www.1point1C.org/ 1.1C - Superluminal!
> * http://www.AThompson.info/andrew/ personal site
Andrew Thompson - 29 Dec 2003 00:48 GMT
> Sorry, here is the relevant code ...

The code, as supplied (_after_ I'd added
the relevant imports and fixed a long line)
opens an unresizeable frame of almost
no size in the upper right..

SSCCE
S(ish) - I suppose
SC - passed.
C - had to add imports - warning.
E -  did not display stated behaviour - failed.

Try again, this time, put the imports in,
make sure all lines are < 80 char, and
the example _shows_ the behaviour..

--
Andrew Thompson
* http://www.PhySci.org/ PhySci software suite
* http://www.1point1C.org/ 1.1C - Superluminal!
* http://www.AThompson.info/andrew/ personal site
Andrew Thompson - 29 Dec 2003 01:10 GMT
> Sorry, here is the relevant code ...

here is the relevant answer..

(and stop using a "Drag'n'Drop" UI
designer, they make tortuous code!)
_______________________________________
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;

public class DiabloBackupRestore
   extends JFrame {

 private Container container;
 private ImageIcon backgroundImage;
 private JPanel backgroundpanel;
 private JButton backupButton, restoreButton, browseButton;
 private JDialog dialog;
 private JLabel savepathLabel, characterLabel, backuppathLabel;
 private JTextField savepathField, backuppathField;
 private JList characterList;
 private JLabel label1,label2, label3;
 private JTextField textfield1, textfield2;
 private JList list1;
 private JButton button1, button2, button3, button4;
 private JFileChooser fileChooser;
 private File saveFolder, backupFolder;

 public DiabloBackupRestore() {
   super("Diablo Backup & Restore");
   container = getContentPane();
   container.setLayout(new BoxLayout(container, BoxLayout.X_AXIS));
   container.add(Box.createHorizontalGlue());
   ButtonHandler handler = new ButtonHandler();
   backupButton = new JButton("Backup");
   backupButton.setToolTipText(
 "Copy character file(s) to another location");
   backupButton.addActionListener(handler);
   container.add(backupButton);
   container.add(Box.createHorizontalGlue());
   restoreButton = new JButton("Restore");
   restoreButton.setToolTipText(
       "Copy character file(s) to Diablo II save folder");
   restoreButton.addActionListener(handler);
   container.add(restoreButton);
   container.add(Box.createHorizontalGlue());
   setResizable(false);
   ((JPanel) container).setOpaque(false);
   ImageIcon background = new ImageIcon("background.jpg");
   JLabel label = new JLabel(background);
   getLayeredPane().add(label, new Integer(Integer.MIN_VALUE));
   int width = background.getIconWidth();
   int height = background.getIconHeight();
   label.setBounds(0, 0, width, height);
   dialog = new JDialog(this, false);
   fileChooser = new JFileChooser();
   setSize(width, height);

   pack();
   validate();

   setVisible(true);
 }

 private class ButtonHandler
     implements ActionListener {

   public void actionPerformed(ActionEvent e) {
     if (e.getSource() == backupButton) {
       showBackupDialog();
     }
     else if (e.getSource() == restoreButton) {
       showRestoreDialog();
     }
   }
 }

 private class DialogButtonHandler
     implements ActionListener {

   public void actionPerformed(ActionEvent e)
   {
     if (e.getSource() == button1)
     {
       selectSavedGamePath();
     }
     else if (e.getSource() == button2)
     {
       selectBackupPath();
     }
   }
 }

 private void showBackupDialog() {

   Container container;

   label1 = new JLabel("Saved games path", SwingConstants.RIGHT);
   label2 = new JLabel("Backup path", SwingConstants.RIGHT);
   label3 = new JLabel("Character", SwingConstants.RIGHT);
   textfield1 = new JTextField(10);
   textfield2 = new JTextField(10);
   list1 = new JList();
   list1.setVisibleRowCount(3);
   list1.setSelectionMode(
 ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
   //  button1 and button2 activate a JFileChooser
   button1 = new JButton("Browse...");
   DialogButtonHandler dialogButtonHandler = new DialogButtonHandler();
   button1.addActionListener(dialogButtonHandler);
   button2 = new JButton("Browse...");
   button2.addActionListener(dialogButtonHandler);
   button3 = new JButton("Ok");
   button4 = new JButton("Cancel");
   button3.setPreferredSize(button4.getPreferredSize());
   DialogButtonHandler handler = new DialogButtonHandler();
   container = dialog.getContentPane();
   container.removeAll();
   container.setLayout( new GridBagLayout());
   GridBagConstraints c = new GridBagConstraints();
   c.insets = new Insets(4, 4, 4, 4);
   c.weightx = 1.0;
   c.weighty = 1.0;
   c.gridx = 0;
   c.gridy = 0;
   c.gridwidth = 2;
   c.gridheight = 1;
   c.fill = GridBagConstraints.HORIZONTAL;
   container.add(label1, c);
   c.gridx = 2;
   container.add(textfield1, c);
   c.gridx = 4;
   c.gridwidth = 1;
   c.fill = GridBagConstraints.NONE;
   c.anchor = GridBagConstraints.WEST;
   container.add(button1, c);
   c.gridx = 0;
   c.gridy = 1;
   c.gridwidth = 2;
   c.fill = GridBagConstraints.HORIZONTAL;
   c.anchor = GridBagConstraints.CENTER;
   container.add(label2, c);
   c.gridx = 2;
   container.add(textfield2, c);
   c.gridx = 4;
   c.gridwidth = 1;
   c.fill = GridBagConstraints.NONE;
   c.anchor = GridBagConstraints.WEST;
   container.add(button2, c);
   c.gridx = 0;
   c.gridy = 2;
   c.gridwidth = 2;
   c.fill = GridBagConstraints.HORIZONTAL;
   c.anchor = GridBagConstraints.CENTER;
   container.add(label3, c);
   c.gridx = 2;
   container.add(list1, c);
   c.gridx = 3;
   c.gridy = 4;
   c.gridwidth = 1;
   c.fill = GridBagConstraints.NONE;
   c.anchor = GridBagConstraints.EAST;
   container.add(button3, c);
   c.gridx = 4;
   c.anchor = GridBagConstraints.WEST;
   container.add(button4, c);
   dialog.setTitle("Backup Diablo II Character");
   dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
   // container.setBackground(Color.RED);
   dialog.setSize(300, 200);
   dialog.show();

 }

 private void showRestoreDialog() {

   Container container;
   container = dialog.getContentPane();
   container.removeAll();
   dialog.setTitle("Restore Diablo II Character");
   dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
   dialog.setSize(300, 200);
   dialog.show();
 }

 private void selectSavedGamePath() {
   fileChooser.setDialogTitle("Select saved game(s) folder");
   fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
   fileChooser.setCurrentDirectory(new File("C:\\"));
   fileChooser.setSelectedFile(null);
   int result = fileChooser.showOpenDialog(dialog);
   if (result == JFileChooser.APPROVE_OPTION) {
     saveFolder = fileChooser.getSelectedFile();
     textfield1.setText(saveFolder.getAbsolutePath());
   }
 }

 private void selectBackupPath() {
   fileChooser.setDialogTitle("Select backup folder");
   fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
   fileChooser.setCurrentDirectory(new File("C:\\"));
   fileChooser.setSelectedFile(null);
   int result = fileChooser.showOpenDialog(dialog);
   if (result == JFileChooser.APPROVE_OPTION)

   {
     // your are storing the information in 'backupFolder'
     backupFolder = fileChooser.getSelectedFile();
     // but using 'saveFolder' ..here
  // textfield2.setText(saveFolder.getAbsolutePath());
     textfield2.setText(backupFolder.getAbsolutePath());

   }

 }

 public static void main(String[] args) {
   try {
     UIManager.setLookAndFeel(
         "com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
   }
   catch (UnsupportedLookAndFeelException ex) {
     System.out.println("Unable to load Windows look and feel " + ex);
   }
   catch (IllegalAccessException ex) {
     System.out.println("Unable to load Windows look and feel " + ex);
   }
   catch (InstantiationException ex) {
     System.out.println("Unable to load Windows look and feel " + ex);
   }
   catch (ClassNotFoundException ex) {
     System.out.println("Unable to load Windows look and feel " + ex);
   }
   DiabloBackupRestore application = new DiabloBackupRestore();
   application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 }
}
___________________________________________

--
Andrew Thompson
* http://www.PhySci.org/ PhySci software suite
* http://www.1point1C.org/ 1.1C - Superluminal!
* http://www.AThompson.info/andrew/ personal site
Mike Conmackie - 29 Dec 2003 06:55 GMT
Andrew,

Thanks for the second set of eyes ... I should have caught that obvious
blunder.  I didn't include the imports because I didn't expect anyone to
actually execute the code and even if they did, the imports would have been
obvious if any sort of Java IDE was being used.  Finally, I'm not using a
drag and drop UI designer ... that torturous code is all mine.  I'm always
looking for pointers on style and proper practices so, to that end, what
makes the code so torturous?

Mike

> > Sorry, here is the relevant code ...
>
[quoted text clipped - 242 lines]
> * http://www.1point1C.org/ 1.1C - Superluminal!
> * http://www.AThompson.info/andrew/ personal site
Andrew Thompson - 30 Dec 2003 02:21 GMT
> Andrew,

Hi Mike could I ask you to do two things?
a) trim irrelevant parts of earler conversations
(that 11Kb of your code w/my 1-2 corrections
was unnecessary
b) put your comments _after_ what you are
quoting (like below)

> Thanks for the second set of eyes ... I should have caught that obvious
> blunder.

You're welcome, it was not that obvious amongst
the 10Kb code.  [ I only realised what was going
on by running your code, which was the closest thing
I'd seen to a SSCCE all day. ]

> ...I didn't include the imports because I didn't expect anyone to
> actually execute the code and even if they did, the imports would have been
> obvious if any sort of Java IDE was being used.

You actually _did_ 'include the imports'.

Usually I am irritated 'cos I have to add them,
but I noticed you were importing each component
specifically.  I simply put the imports up at the top,
where they most commonly are. (It also saved some
space and allows a (mere) human to know what
is used 'at a glance'.

For a final project there might be good reason to
name each import specifically (at the top of the code),
but I argue in test code it's best to simply import
entire packages..

>.. Finally, I'm not using a
> drag and drop UI designer ... that torturous code is all mine.  I'm always
> looking for pointers on style and proper practices so, to that end, what
> makes the code so torturous?

* I hereby retract the word 'torturous',
my apologies

(Whince - extracts foot from mouth)
Sorry!  I saw the GridBagLayout and
jumped to conculsions.  I figured the
most common way for a UI designer
program to lay out a container was to
use a 'null' layout and exact positioning,
the _second_ most common would be
a GBL.  (I am probably completely wrong
about UI designers using GBLs - shrug)

If you're a noob I recommend dumping the
GBL (for the moment) and using combinations
of other nested layouts.

If you are having problems with the size/shape
of your components in this design, it is most
probably due to errors in coding the GBL,
which is powerful, but easy to stuff up.

So I suppose, if your GUI is fine and this is
a one-off - stick with it.  If, OTOH, you are
learning Java and likely to ask for help on
the layout, I'd recommend changing it to a
nested layout.

Actually, apart from that, your code is
looking a lot less 'torturous' today (I wish
I had not used that word), after all, your
code does not really do the things listed here..
http://mindprod.com/unmain.html

The only other thing that I might suggest
_today_ is that you change the class name
from 'DiabloBackupRestore', which is based
atound verbs or 'doing words' to one which
based on nouns or 'names' (I include that for
folks who use ESL).

So 'DiabloBackupRestore' might become
'DiabloOptions' or such..

* I wanted to get the retraction in early,
before I delivered the pathetic excuses
(since the retraction was much more important)

The pathetic excuses consist of:
It was late..,
I'd looked at a lot of code that day..,
I was in a bad mood...
(drone on incessantly...)

--
Andrew Thompson
* http://www.PhySci.org/ PhySci software suite
* http://www.1point1C.org/ 1.1C - Superluminal!
* http://www.AThompson.info/andrew/ personal site
Mike Conmackie - 30 Dec 2003 04:09 GMT
> on by running your code, which was the closest thing
> I'd seen to a SSCCE all day. ]

Please forgive my ignorance but what is an SSCCE?

> * I hereby retract the word 'torturous',
> my apologies

No apology required :-)

> If you're a noob I recommend dumping the
> GBL (for the moment) and using combinations
> of other nested layouts.

I'm a relative noob to Java but in most other respects I'm a 20 year veteran
with particular emphasis on IBM "big iron" (but _not_ COBOL -- I loathe the
language).

> If you are having problems with the size/shape
> of your components in this design, it is most
> probably due to errors in coding the GBL,
> which is powerful, but easy to stuff up.

I selected GBL only becuase I find it a royal pain in the *ss to create and
populate a lot of sub-containers each potentially having their own layout
manager instance.  The only problem comes when you want certain components
to grow/shrink at different rates than other components (i.e. setting
weightx/weighty to some value(s) other than 1.0). I've managed to avoid this
situation so far in my cozy little world :-))

> The only other thing that I might suggest
> _today_ is that you change the class name
> from 'DiabloBackupRestore', which is based
> atound verbs or 'doing words' to one which
> based on nouns or 'names' (I include that for
> folks who use ESL).

Here again, forgive my lack of competency in this new vernacular but, what
is an ESL?

Thank you for your time, effort and feedback.  I think that you are a great
resource to this and any other newsgroups that you participate in.

Mike
Andrew Thompson - 30 Dec 2003 11:12 GMT
> > on by running your code, which was the closest thing
> > I'd seen to a SSCCE all day. ]
>
> Please forgive my ignorance but what is an SSCCE?

Short/Small, Self Contained, Compileable, Example.

Theory is.  Cut, copy, paste, compile, run..

More people should know how to make them
and I have been idly threatening to make a
page explaining how to go about it, and
explaining why it is so useful.
...
> > The only other thing that I might suggest
> > _today_ is that you change the class name
[quoted text clipped - 5 lines]
> Here again, forgive my lack of competency in this new vernacular but, what
> is an ESL?

;-)  Not part of Java or OOP..

English as a Second Language.  I think too often
we throw words around, not considering how
hard it must be for people who had to learn
English after their native tongue,  ..and I like to
speak to as many people as I can.    :)

> Thank you for your time, effort and feedback.

You're welcome.     :-)

--
Andrew Thompson
* http://www.PhySci.org/ PhySci software suite
* http://www.1point1C.org/ 1.1C - Superluminal!
* http://www.AThompson.info/andrew/ personal site


Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.