Friday, August 30, 2013

How to create a Eclipse plugin wizard page part 1

To create a Plugon wizard you need to first create a temple for your page.
This class can be extended from the class WizardPage.  An abstract base implementation of a wizard page. We can use the following  methods to configure the wizard page:

  •     setDescription
  •     setErrorMessage
  •     setImageDescriptor
  •     setMessage
  •     setPageComplete
  •     setPreviousPage
  •     setTitle


You can get more information about these methods from here.
This is my page template let see what each of these code segmants do.

class RS_wizard_page1 extends WizardPage {
   
    private Text host;
    private Text port;
    private Text path;
    public String server_url;
    private Composite container;
    private Object user_select_value;
    String[][] Value_ecg_providers;
   
        public RS_wizard_page1(Object user_select_value ) {
        super("Hello Remote Service Host");
        this.user_select_value = user_select_value;
        setTitle("Hello Remote Service Host");
        setDescription("Enter data for your server");   
       
    }

    @Override
    public void createControl(Composite parent) {
       
        container = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout();
        container.setLayout(new GridLayout(1,false));
        layout.numColumns = 1;
         
         
        Label example = new Label(container, SWT.NONE);       
        example.setText("Example             ecftcp://localhost:3282/server");

       
        Label Host = new Label(container, SWT.NONE);
        Host.setText("Host");
        host = new Text(container, SWT.BORDER | SWT.SINGLE);
        host.setText("");
       
        Label Port = new Label(container, SWT.NONE);
        Port.setText("Port");
        port = new Text(container, SWT.BORDER| SWT.SINGLE);
        port.setText("");
       
        Label Path = new Label(container, SWT.NONE);       
        Path.setText("Path");
        path = new Text(container, SWT.BORDER| SWT.SINGLE);
        path.setText("");
       
       
       
        host.addKeyListener(new KeyListener() {

            @Override
            public void keyPressed(KeyEvent e) {
            }

            @Override
            public void keyReleased(KeyEvent e) {
                if (!host.getText().isEmpty()) {
                    setPageComplete(true);

                }
            }

        });
       
        port.addKeyListener(new KeyListener() {
           
            @Override
            public void keyReleased(KeyEvent e) {           
               
            }
           
            @Override
            public void keyPressed(KeyEvent e) {
                if (!port.getText().isEmpty()) {
                    setPageComplete(true);

                }
               
            }
        });
       
        path.addKeyListener(new KeyListener() {
           
            @Override
            public void keyReleased(KeyEvent e) {
                               
            }
           
            @Override
            public void keyPressed(KeyEvent e) {
                if (!path.getText().isEmpty()) {
                    setPageComplete(true);

                }
            }
        });
       
       
        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
        host.setLayoutData(gd);
        port.setLayoutData(gd);
        path.setLayoutData(gd);
        // Required to avoid an error in the system
        setControl(container);
        setPageComplete(false);

    }

    public String getText1() {
        return host.getText();
    }

    public String getText2() {
        return port.getText();
    }

    public String getText3() {
        return path.getText();
    }
//to get the full server url
    public String getServer_url() {
        return server_url;
    }

    public void setServer_url(String server_url) {
        this.server_url = server_url;
        server_url= getText1()+getText2()+getText3();
    }
   
    @Override
    public IWizardPage getNextPage() {
        // TODO Auto-generated method stub
        return super.getNextPage();
    }
   
   
   
}





From the following part we set the page title,description of the page

        super("Hello Remote Service Host");
        this.user_select_value = user_select_value;
        setTitle("Hello Remote Service Host");
        setDescription("Enter data for your server");   




Then we need to configure the layout of the page.I have done it in the following way.

        container = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout();
        container.setLayout(new GridLayout(1,false));
        layout.numColumns = 1;
       


Frist I have create a new  container. This new instance of this class given its parent and a style value describing its behavior and appearance.

Then I have created a new layout. which controls children of a Composite in a grid. GridLayout has a number of configuration fields, and the controls it lays out can have an associated  layout data object, called GridData.

Because I need only  one column i have set the numColumns to one. 


How to put a label in the page  

 

We can create a new label  and have  include the parent a composite control which will be the parent of the new instance(in our case it is container ) and this cannot be null  and the style we need for the labe control to construct. In here I have put it has none
         Label Host = new Label(container, SWT.NONE);
       


Then we can say what does the label need have say by simpley invoking the method setText.

        Host.setText("Host");


Then we create a new  instance of this class given with the parent and a style value describing its behavior and  appearance.

        host = new Text(container, SWT.BORDER | SWT.SINGLE);


Wednesday, August 21, 2013

How create and retrieve all 2D array data from Java propertie file in a Eclipse Project.

In this project I needed to have a 2D array. Which had the information about the items that I needed to be put in a combo box.
It can be easely done by creating a 2D array in the code. But hard coding that kind of information is not good programming practice therefore I decided to create a property file which had that information.
If the user want to change what is in the drop down meneu he can easily do it by changing the property file that is the advantage of having a property file.


How to add Property file 

In the package explorer, right-click on the package and select New -> File, then enter the filename including the ".properties" suffix.




  

How to create a 2D array in property file.

To do that you can use the following syntax.

ecf_providers=0,ECF Generic;1,r-OSGi;2,ecf.generic.server;3,ecf.filetransfer.bittorrent;\
4,ecf.msn.msnp;5,ecf.discovery.jslp;6,ecf.msn.msnp;7,ecf.xmpp.smack;

 

I have put  "\" at the end of the first line to make sure that all the array data will be retrieved when the the method in the code uses the property file otherwise only the first line will be read form the property file. Another way to do is write the array as a single line like this.

ecf_providers=0,ECF Generic;1,r-OSGi;2,ecf.generic.server;3,ecf.filetransfer.bittorrent;4,ecf.msn.msnp;5,ecf.discovery.jslp; 


Retrieve all 2D array data from Java properties file.

To get data from the property file and store it in a 2D array you can use the following two methods.

What this methods do is they one method read the data from the property file and the other method store that data in a array called Value_ecg_providers.

 

To read the data from the property file you can use a method like this.

    private static String[][] fetchArrayFromPropFile(String propertyName,
            Properties propFile) {
        String[] a = propFile.getProperty(propertyName).split(";");
        String[][] array = new String[a.length][a.length];
        for (int i = 0; i < a.length; i++) {
            array[i] = a[i].split(",");
        }
        return array;
    }

 

try {
            providers.load(RemoteServiceConsumerExample1Template.class
                    .getClassLoader().getResourceAsStream(
                            "providers.properties"));
            Value_ecg_providers = fetchArrayFromPropFile("ecf_providers",
                    providers);

        } catch (FileNotFoundException e) {
            System.out.print("Property file not found");
           
            e.printStackTrace();
        } catch (IOException e) {
            /
            e.printStackTrace();
        }

    } 

 Had to use the  <RemoteServiceConsumerExample1Template.class
                                    .getClassLoader().getResourceAsStream(
                            "providers.properties"))
>

 because I am loading the file from classpath.

If you need to load a properties file from the file system and retrieved the property value you can simple use something like this.

 


public class Test
{
    public static void main( String[] args )
    {
        Properties property = new Properties();

        try {
            //set the properties value

          
              property.setProperty("database", "localhost"); 
              property.setProperty("ABC", "CSE");        
              property.setProperty("letter ", "A");

            //save properties to project root folder
            prop.store(new FileOutputStream("config.properties"), null);

        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}