Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

Typed pages or hand-written pages?

ddanbe commented: You have a mind as nauthy as I have +2
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

The new post listings on the "main page" for top-level forums no longer indicate which forum the post is in. Listing the forum is helpful to determine if the post is in one of the forums you participate in a lot.

peter_budo commented: Well spotted, I agree with that +12
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

Use the newLine() method to write the line separator, instead of appending '\n' to your text.

Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

Ok, building a bit on the LoginFrame code above, here is a tiny framework that manages a login frame and a main app frame that is shown for a valid user. It doesn't do much, but should illustrate the point a bit.

I threw the other classes in at the bottom so it could be pasted into and run from a single file. Obviously, you would want to separate them to appropriate top-level public classes.

The only valid login is "Bob","12345". (And don't take this to be an example of managing secure logins, the MainApp controller is the point of the code :P )

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

public class LoginFrame extends JFrame {

    private Dimension dimLF = new Dimension(250, 200);
    LoginPanel loginJP;
    ErrorPanel errJP;
    
    MainApp mainApp;

    public LoginFrame(MainApp mainApp) {
        super();
        this.mainApp = mainApp;
        
        setTitle("BMS - Login");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();

        loginJP = new LoginPanel();
        gbc.gridx = 0;
        gbc.gridy = 1;
        getContentPane().add(loginJP, gbc);

        errJP = new ErrorPanel();
        gbc.gridx = 0;
        gbc.gridy = 0;
        getContentPane().add(errJP, gbc);

        setSize(dimLF);

        setResizable(false);
        setVisible(true);

    }

    class LoginPanel extends JPanel {
        LoginCredentials credentials;
        final JTextField usrTF;
        final JPasswordField passPF;
        
        public LoginPanel() {
            setLayout(new GridBagLayout());

            GridBagConstraints gbc = new GridBagConstraints();
            
            JPanel usrPanel = new JPanel();
            JLabel usrLabel = new JLabel("Username:");
            usrTF = new JTextField(10);
            usrTF.setToolTipText("Please enter your username.");
            usrPanel.add(usrLabel);
            usrPanel.add(usrTF);

            JPanel passPanel = new JPanel();
            JLabel passLabel = …
jasimp commented: What would the Java forum be without you? +9
peter_budo commented: Another great example +12
Alex Edwards commented: You're a hero. +5
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

Nah, it's not really that hard if you're insane, as the results are likely to be insane as well - but you won't mind... because you're insane...

Rashakil Fol commented: Ok, I think you win the thread. +7
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

I think some slight modifications to your design could make things much easier. You may want to consider something like this as a starting point

import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Ellipse2D;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Brownian {

    public static void main(String[] args) {
        JFrame box = new JFrame();
        Container background = box.getContentPane();
        background.setBackground(new Color(255, 250, 202));
        box.setSize(700, 700);
        box.setTitle("Browniand Motion.");
        box.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        ParticlePanel particlePanel = new ParticlePanel();
        box.add(particlePanel);
        box.setVisible(true);

        Timer mover = new Timer(25, particlePanel);

        mover.start();

    }
}

/** This panel serves as the container for your Particle objects */
class ParticlePanel extends JPanel implements ActionListener {

    List<Particle> particles = new ArrayList<Particle>();

    public ParticlePanel() {
        super();
        // add a particle
        particles.add(new Particle());
        // this is all you need to add another
        particles.add(new Particle());
    }

    /** invoked by the Timer callback */
    public void actionPerformed(ActionEvent event) {
        for (Particle p : particles) {
            p.updatePosition();
        }
        repaint();
    }

    public void paintComponent(Graphics g) {
        // clear the panel
        g.clearRect(0, 0, getWidth(), getHeight());
        // render each particle
        for (Particle p : particles) {
            p.render(g);
        }
    }
}

/** This class now just deals with the specifics of 
 * a particle itself. It doesn't need to know anything 
 * about listeners or the container.
 */
class Particle {

    public Particle() {
        rand = new Random();
        // You could pass these as parameters here if you want to
        // randomize the location and size when you create them. …
coveredinflies commented: Thanks very nice of you! +1
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

If you haven't already, you may want to look through the Ellipse2D API. It has methods related to containment and intersection that may prove useful.

dickersonka commented: good find, forgot all about this +2
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

im bored.
im posting this because im bored.
yup...
ughhhhhhhhhh....
im soooooooooooooooooooooo bored...
is there anyone out there that wants to chat???
anyone???
at all?
=|

All of these people do. They're bored as well, I imagine.

Nick Evan commented: I think you might be right! +11
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

Well, if they are four individual variables you could use nested min/max calls

int a = 2;
int b = 22;
int c = 3;
int d = 345;
System.out.println(String.valueOf(Math.min(Math.min(a, b), Math.min(c, d))));
System.out.println(String.valueOf(Math.max(Math.max(a, b), Math.max(c, d))));

If they are an array, you could just call Arrays.sort() and pull the first and last, or loop them and find them yourself.

Unless you're doing it in a tight loop, it probably won't make much difference for just 4 values.

Edit: Actually, I wouldn't bother sorting if they are an array. It's just unnecessary overhead. Just loop them

int[] arr = {2,22,3,345};
int min=Integer.MAX_VALUE;
int max=Integer.MIN_VALUE;
for (int i : arr){
    if (i<min) min = i;
    if (i>max) max = i;
}
System.out.println("min: "+min);
System.out.println("max: "+max);
jbennet commented: helpful +32
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

I'm saying that you need to actually assign those variables the value you want them to have. If you want to store what "readData()" returns in the variable "lbs", then you have to use that statement lbs = readData(); . You have all zeros in your program because you haven't changed their values after you initialized them. Those methods you have written will not fill in the values of the parameters you have passed them.

I'd recommend re-reading all your notes on using methods and perhaps this as well: http://www.codeguru.com/java/tij/tij0036.shtml

programmingme commented: Thank You so much for your help! +1
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

Well of course it does. You set the text to that number. If you want that label to remain the same then use a separate label for the converted value.

stephen84s commented: Oh dear never could have imagined that was his problem +3
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

17 views so far and I'm the only one who voted. :-/

Alex Edwards commented: Fine I'll vote too! XP +4
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

cant u read?

Can't you write?

ACCOUNTING MAJOR...i dont have any background in this.this is the first and definatly the last cis course ill be taking ever.

YOUR COURSEWORK. Regardless of your background, you can either make the effort to pass or fail the course.

plus i really dont think i nything is wrong with my attitude.i only just registered and this was my first post.Also..plz dont waste ur time,i asked fr help..not a favor.

No, actually you asked and continue to ask for a favor. You can't even be bothered to type in proper English, just this IM-speak drivel. You're too lazy to communicate acceptably and too lazy to put any effort into the assignment. Why should anyone else put any of their own effort into doing your homework for you?

VernonDozier commented: Well said. +8
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

Tabs? Why wouldn't that work?

This.
Modern browsers allow you to have more than one page open at a time. Try Firefox.

(They have push-button phones now too. No more turning that little dial! Nifty!)

humbug commented: I think this should be part of your rep :P +4
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

Code has already been provided and your unrelated question in another forum has absolutely no bearing on this poster's current issues.

dickersonka commented: The posting enforcer!!! +2
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

First off, read the tutorial on using custom cell renders: http://java.sun.com/docs/books/tutorial/uiswing/components/table.html#renderer
and here is another example: http://www.exampledepot.com/egs/javax.swing.table/CustRend.html?l=rel

The render will be called for each cell in the table that you have registered it for. Look at the parameters that are supplied when the render is requested:

getTableCellRendererComponent(JTable table, Object value,
                boolean isSelected, boolean hasFocus, int rowIndex, int vColIndex)

You have plenty of information available there to alter how it gets rendered based upon the particulars of that cell value or other information available in your class.

Here's an example of a renderer I used to color cells red or green when a gap exceeds minimum or maximum thresholds which can be set by the user in a couple of text fields on the panel:

class GapColRenderer extends DefaultTableCellRenderer{
    private final Color MIN_COLOR = Color.GREEN;
    private final Color MAX_COLOR = Color.RED;

    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int rowIndex, int vColIndex) {

        Component comp = super.getTableCellRendererComponent(table,value,isSelected,hasFocus,rowIndex,vColIndex);

        if (((Double)value).doubleValue() > maxGapThreshold){
            if (isSelected){
                comp.setBackground(new Color((MAX_COLOR.getRGB() ^ comp.getBackground().getRGB())));
                comp.setForeground(new Color(Color.BLACK.getRGB() ^ comp.getForeground().getRGB()));
            } else {
                comp.setBackground(MAX_COLOR);
                comp.setForeground(Color.BLACK);
            }
        } else if (((Double)value).doubleValue() < minGapThreshold){
            if (isSelected){
                comp.setBackground(new Color((MIN_COLOR.getRGB() ^ comp.getBackground().getRGB())));
                comp.setForeground(new Color(Color.BLACK.getRGB() ^ comp.getForeground().getRGB()));
            } else {
                comp.setBackground(MIN_COLOR);
                comp.setForeground(Color.BLACK);
            }
        } else {
            if (isSelected){

            } else {
                comp.setBackground(Color.WHITE);
                comp.setForeground(Color.BLACK);
            }
        }
        return comp;
    }
}
darkagn commented: Great info :) +3
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

Yes, it's possible to "add further functionality" by composing new classes of your own that use those classes internally to extend or alter the functionality (assuming there are not licensing issues). Of course, you do need to understand the API of the other classes if you expect to do much with them, which was s.o.s's point.

If you stop to think on it a moment, you do this any time you write a program with the JDK. You utilize the existing classes in the API to build new ones of your own that offer some intended functionality.

Alex Edwards commented: Very good point =) +4
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

Perhaps you should do a project that will spider the internet and aggregate all the thousands and thousands of "Final Year Project" request threads that already exist on this and countless other forums. Then we could just point all of these identical threads to your project site.
:-/

Salem commented: Ha ha ha - nice one :) +23
ddanbe commented: Respect! +1
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster
darkagn commented: As always, a source of great knowledge :) +3
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

That wasn't very illuminating. :-)

See what I mean? ;)

~s.o.s~ commented: Haha :-) +23
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

I would just guess it stems from the fact you created a fixed size buffer image and rendered the red circle on it without anti-aliasing. You then draw that image in paintComponent. The image itself will be unchanged and I don't think turning on anti-aliasing in paintComponent will affect that image.

VernonDozier commented: Pinpointed the problem. +8
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

Ok, with your method

public void UpdateTransaction(String q1, String q2, String q3, String q4, String q5, Connection con)

what happens when you only want to execute 2 statements or you need to execute 10 statements? Consider using a List as a parameter instead of coding in an arbitrary set of numbered parameters.

Also, you need to make sure you close your statement in the finally block. Always close statements when you are finished with them.

Alex Edwards commented: Yes, I sometimes forget to do that to with Databases @_@ +4
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

What's wrong is that you posted that wall of code without code tags, creating an awful mess that no one is going to wade through to find this vague "event" you refer to.

Not urgent.

jasimp commented: Actually, I couldn't find any events that worked, out of the 15ish I tried in my quick run ;) +8
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

Toy guns don't kill toy people, toy people do.

twomers commented: Always remember the thousands of innocents who gave their lives willingly to prove this. +6
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

You could use Scanner or a simple BufferedReader and the regex classes.

stephen84s commented: Short Sweet and to the Point +3
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

Vernon, can you post a simple example or two of what determines whether or not the objects blow up? You mentioned that it's not only a matter of the types themselves that determine the result, as in A + B always explodes while A + C never does.

If you can describe the determination of the result a bit more it would help.

Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

That still involves runtime instanceof checks. I would agree with Narue's suggestion.

Alex Edwards commented: Yeah, I do to! I was hoping my suggestion would be reasonable, though you make a good point. +4
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

Josh Bloch has an excellent article specifically on substitutes for C constructs here:
http://java.sun.com/developer/Books/shiftintojava/page1.html
It is an actually a chapter except from his book Effective Java Programming, which I would highly recommend for any Java programmer.

Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

You didn't read any of this thread at all, did you? :icon_rolleyes:

Salem commented: s'all right - so long as they can read a menu, and write down what people ask for, they'll be fine. +17
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

I don't see any reason not to delete them. They offer absolutely nothing to the content of the forums. Legitimate questions on project implementation may be useful, but "give me teh codez" posts are a waste of storage space (and so are the posters for that matter).

Salem commented: WOMBAT's the lot of 'em ;p +36
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

Yep, better get acquainted with these pages: http://java.sun.com/docs/books/tutorial/uiswing/index.html

iamthwee commented: nice link +17
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

If you don't have an API that you can use for the target program then about the only thing you could try would be the Robot class. There's a tutorial that demonstrates how it can be used to interact with other programs here: http://www.developer.com/java/other/article.php/2212401

It would be a clunky solution at best, but if you have no API nor command line access, it's about the only thing left. Unless, of course, you can hack the underlying data store and write in the field values directly ;)

PoovenM commented: You're just bloody brilliant mate! Thanks for the reply :) +3
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

In the first version, I think the only problem is that you are calling cancel on the timer, instead of the timekeeping task. I ran this simplified example here and it works just fine.

import java.util.Timer;
import java.util.TimerTask;

public class FrameThread extends javax.swing.JFrame {

    Timer timer;
    TimeKeeping timeKeeperTask = null;
    boolean timerRunning = false;

    public FrameThread() {
        initComponents();
        timer = new Timer();
    }

    private class TimeKeeping extends TimerTask {
        public void run() {
            timerRunning = false;
            jLabel1.setText("time up!");
            System.out.println("Timer expired");
        }
    }

private void formKeyPressed(java.awt.event.KeyEvent evt) {
    //Rest of the function that is not relevant to problem
//        repaint();

    if (timerRunning) // boolean check, if true execute
    {
        System.out.println("Cancel timer");
        timeKeeperTask.cancel();
    }
    System.out.println("Start new timer");
    jLabel1.setText("running");
    timeKeeperTask = new TimeKeeping();
    timer.schedule(timeKeeperTask, 2000);
    timerRunning = true;
    System.out.println("New timer started");

}

    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                formKeyPressed(evt);
            }
        });
        getContentPane().setLayout(new java.awt.FlowLayout());

        jLabel1.setText("jLabel1");
        getContentPane().add(jLabel1);

        pack();
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new FrameThread().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JLabel jLabel1;
    // End of variables declaration

}
peter_budo commented: Thank you for another great example of code :) +10
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

So declare "filescan" static then.

static Scanner filescan = null;

It's worth noting that making everything static and calling it from main() is not how Java is meant to be used, though intro courses often start with such programs. Java is an object-oriented language and should be taught as such. Making it all static relegates it to a procedural program and defeats the whole purpose.

stephen84s commented: Yep gives me heart burns when I see Java used like this +3
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

If you create an instance of SimpleDateFormat using a pattern that corresponds to your intput, you can use the parse(String) method to convert the string input to a Date object, which you can then use to get the day of the week. Calendar is what you should really use for this, but I'm not sure what the specifics of your assignment are (and the whole date/calendar thing is pretty much a mess anyway).

Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

I found this article interesting: Bailout Boondoggle.

I would agree with nearly every point made there.

This part in particular is what really galls me about the current Republican party:

There does exist, however, “Big Government Republicanism.” Big Government Republicanism, hand in hand with Neo-conservatism, has brought us welfare for pharmaceutical companies, McCain-Feingold, the Patriot Act and the notion that we can impose our will on all the nations of the world.

Fiscal conservatism and personal responsibility aren't even on the radar of the Republicans these days and have been replaced by cronyism, social conservatism, and right-wing authoritarianism.

Dave Sinkula commented: Yup. +17
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

The Sun Swing tutorials also cover this: http://java.sun.com/docs/books/tutorial/uiswing/components/dialog.html

Keep that tutorial trail bookmarked for future reference on using Swing components.

stephen84s commented: Yep the right place to go to. +3
Alex Edwards commented: Great recommendation =) +4
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

Keep in mind that updates to Swing components should be done on the AWT event queue.
http://java.sun.com/docs/books/tutorial/uiswing/concurrency/index.html

Alex Edwards commented: Yes. Sorry for the late rep-bump, but information like this is imperative! =) +4
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster
Alex Edwards commented: +1 for quoting Sun =) +4
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

Well, since you are a "professional" why can you not suggest one for her?

Better yet, she could take some initiative and actually do a little bit of research to come up with her own - which is kind of the point of tasking the student to decide upon the project, rather than just telling them what to do.

Salem commented: Quite so. Industry wants people who can think for themselves, not dolts waiting to be spoon fed (though they do have their uses). +21
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

At least McCain knows how to interrogate prisoners...

he was interrogated

Yes, that part is obvious. What is unclear is what you feel that implies:

That he knows the brutally effective ways to get people to talk?
That he knows "morally right" way to do it? (Which would be what exactly, in your own estimation?)
That Obama does not know how? (Is he supposed to?)
That someone who is familiar with interrogation is the most appropriate candidate for the Presidency?

Someone above agreed that you had a good point. I fail to see how it's a relevant point at all, given the complete ambiguity of your uncompleted assertion.

scru commented: Agreed. +3
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

Sure, that's a great idea...
until you actually think about it for more than one second.

VernonDozier commented: Ha Ha +7
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

Just to answer the question on waiting for one thread to finish before starting the next, here's a trivial example using the join() method

public class JoinExample {

    public static void main(String args[]) {
        Thread t1 = new Thread(new FirstTask());
        Thread t2 = new Thread(new SecondTask());
        
        t1.start();
        try {
            // wait for t1 to complete
            t1.join();
        } catch (InterruptedException ex) {
            Thread.currentThread().interrupt();
        }
        // start the next
        t2.start();
    }
    
    static class FirstTask implements Runnable {
        int counter=0;
        
        public void run() {
            try {
                while (counter<10){
                    System.out.println(++counter);
                    Thread.sleep(500);
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
    }
    
    static class SecondTask implements Runnable {
        int counter=64;
        
        public void run() {
            try {
                while (counter<74){
                    System.out.println(Character.toChars(++counter));
                    Thread.sleep(1000);
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
    }
}
peter_budo commented: Thank you for advice +10
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

One hour of community service (picking up litter, public land and utilities maintenance and improvements, etc) per spam email sent.

1,000,000 emails sent, mandatory 12 hour work day imposed = 228 years labor.

Sounds reasonable to me.

scru commented: I like it. +3
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

The problem is originating with your creation of the affine transform that you are rotating:

AffineTransform af = new AffineTransform ();

If you change that to pass the original transform to the constructor, it works just fine:

AffineTransform af = new AffineTransform (orig);

Without backtracing the stack on every repaint() call, I can't tell you for certain, but I would guess the new transform is getting generated against the frame context when you resize and using the CanvasPanel on the other events. The fact that it's an inner class of another visual component further clouds the issue.

Honestly, you don't need to create a new transform from scratch anyway. Just call rotate directly on the graphics context

g2.rotate(angle, ovalCenterX, ovalCenterY);

and it behaves just fine.

Also, if you move the setVisible() call to the end of the ColorForms constructor, it will paint the components you added properly on construction.

VernonDozier commented: Very helpful. +7
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

Your requirement, as stated, is non-functional.

Alex Edwards commented: XD +4
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster
new SearchResult(String s).setVisible(true);

Read any reference at all on Java and you will see that this is not the correct way to call a method. Method calls do not include the type with the parameter.

This is HelloWorld-level basic language semantics. I would recommend reading a lot of this: http://www.codeguru.com/java/tij/

masijade commented: Great endurance to read through that, for something like this. ;-) +8
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

i don't know weather it is involved in a network or not. how i should know wheather it is involved in a network or not.

If he's not on a network, how do you figure he's going to have an IP address? Do you know what an IP address is for?

Ezzaral 2,714 Posting Sage Team Colleague Featured Poster

If you heard about JMF, did you look at Sun's website for it? Did you read any of the tutorials and examples that are there? Some initiative would go a long ways.

Alex Edwards commented: Spoon feed =) +4
Ezzaral 2,714 Posting Sage Team Colleague Featured Poster
Alex Edwards commented: Whoo! =) +4