Multiple tooltips at once

I have an application that uses a JPanel with multiple JLabels in it. Each JLabel has a ToolTip to display. I would like to implement a button that when clicked, displays all ToolTips at once. Any ideas on how to do this?
Bonus: If not by default, the ToolTips should be arranged, if possible, in a way so that they do not overlap each other. (5 Duke dollars)

WARNING!!! This is a hack! I had a theory that I could drag code out of TooltipManager and display the tooltips. It worked, however, this is just test code. I paid very little attention to figuring out what every piece of code did. I commented out some pieces and created some variables where they were undefined. You should probably redo what I did and put a little more thought into it. Anyways, here it is.import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.ArrayList;
public class Test extends JFrame  {
  Container content = getContentPane();
  ArrayList tips = null;
  public Test() {
    super("Test");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel jp = new JPanel(new FlowLayout());
    content.add(jp, BorderLayout.CENTER);
    JTextArea jta = new JTextArea("Four score and seven years ago");
    jta.setWrapStyleWord(true);
    jta.setLineWrap(true);
    JScrollPane jsp = new JScrollPane(jta);
    jsp.setPreferredSize(new Dimension(100,100));
    jta.setToolTipText("Abe Lincoln");
    jp.add(jsp);
    JTextField jtf = new JTextField("Inna Gadda Da Vida");
    jtf.setToolTipText("Iron Butterfly");
    jp.add(jtf);
    JButton jb = new JButton("Tooltips");
    content.add(jb, BorderLayout.SOUTH);
    jb.addMouseListener(new MouseAdapter() {
      public void mousePressed(MouseEvent me) {
        tips = getAllToolTips(content, new ArrayList());
        for (int i=0; i<tips.size(); i++) {
          ((Popup)tips.get(i)).show();
      public void mouseReleased(MouseEvent me) {
        for (int i=0; i<tips.size(); i++) {
          ((Popup)tips.get(i)).hide();
    setSize(300, 300);
    setVisible(true);
  public static void main(String[] args) { new Test(); }
  public ArrayList getAllToolTips(Container c, ArrayList al) {
    Component[] comps = c.getComponents();
    for (int i=0; i<comps.length; i++) {
      if (comps[i] instanceof JComponent) {
        String s;
        if (comps.isShowing() && comps[i].isEnabled() &&
comps[i] instanceof JComponent &&
(s=((JComponent)comps[i]).getToolTipText())!=null) {
JToolTip tip = ((JComponent)comps[i]).createToolTip();
tip.setTipText(s);
MouseEvent mouseEvent = new MouseEvent(comps[i], 0, 0, 0, 0,0,1,false,0);
Point screenLocation = comps[i].getLocationOnScreen();
Point location = new Point();
Rectangle sBounds = comps[i].getGraphicsConfiguration().
getBounds();
boolean leftToRight = true;//SwingUtilities.isLeftToRight(comps[i]);
Dimension size = tip.getPreferredSize();
Point preferredLocation = ((JComponent)comps[i]).getToolTipLocation(mouseEvent);
if(preferredLocation != null) {
location.x = screenLocation.x + preferredLocation.x;
location.y = screenLocation.y + preferredLocation.y;
if (!leftToRight) {
location.x -= size.width;
} else {
location.x = screenLocation.x + mouseEvent.getX();
location.y = screenLocation.y + mouseEvent.getY() + 20;
if (!leftToRight) {
if(location.x - size.width>=0) {
location.x -= size.width;
// we do not adjust x/y when using awt.Window tips
// if (!heavyWeightPopupEnabled){
Rectangle popupRect=null;
if (popupRect == null){
popupRect = new Rectangle();
popupRect.setBounds(location.x,location.y,
size.width,size.height);
int y = getPopupFitHeight(popupRect, comps[i]);
int x = getPopupFitWidth(popupRect,comps[i]);
if (y > 0){
location.y -= y;
if (x > 0){
// adjust
location.x -= x;
// Fit as much of the tooltip on screen as possible
if (location.x < sBounds.x) {
location.x = sBounds.x;
else if (location.x - sBounds.x + size.width > sBounds.width) {
location.x = sBounds.x + Math.max(0, sBounds.width - size.width)
if (location.y < sBounds.y) {
location.y = sBounds.y;
else if (location.y - sBounds.y + size.height > sBounds.height) {
location.y = sBounds.y + Math.max(0, sBounds.height - size.height);
PopupFactory popupFactory = PopupFactory.getSharedInstance();
// if (lightWeightPopupEnabled) {
// popupFactory.setPopupType(PopupFactory.LIGHT_WEIGHT_POPUP);
// else {
// popupFactory.setPopupType(PopupFactory.MEDIUM_WEIGHT_POPUP);
Popup tipWindow;
tipWindow = popupFactory.getPopup(comps[i], tip,
location.x,
location.y);
// popupFactory.setPopupType(PopupFactory.LIGHT_WEIGHT_POPUP);
al.add(tipWindow);
if (comps[i] instanceof Container) getAllToolTips((Container)comps[i], al);
return al;
private int getPopupFitWidth(Rectangle popupRectInScreen, Component invoker){
if (invoker != null){
Container parent;
for (parent = invoker.getParent(); parent != null; parent = parent.getParent()){
// fix internal frame size bug: 4139087 - 4159012
if(parent instanceof JFrame || parent instanceof JDialog ||
parent instanceof JWindow) { // no check for awt.Frame since we use Heavy tips
return getWidthAdjust(parent.getBounds(),popupRectInScreen);
} else if (parent instanceof JApplet || parent instanceof JInternalFrame) {
Rectangle popupFrameRect=null;
if (popupFrameRect == null){
popupFrameRect = new Rectangle();
Point p = parent.getLocationOnScreen();
popupFrameRect.setBounds(p.x,p.y,
parent.getBounds().width,
parent.getBounds().height);
return getWidthAdjust(popupFrameRect,popupRectInScreen);
return 0;
// Returns: 0 no adjust
// >0 adjust by value return
private int getPopupFitHeight(Rectangle popupRectInScreen, Component invoker){
if (invoker != null){
Container parent;
for (parent = invoker.getParent(); parent != null; parent = parent.getParent()){
if(parent instanceof JFrame || parent instanceof JDialog ||
parent instanceof JWindow) {
return getHeightAdjust(parent.getBounds(),popupRectInScreen);
} else if (parent instanceof JApplet || parent instanceof JInternalFrame) {
Rectangle popupFrameRect=null;
if (popupFrameRect == null){
popupFrameRect = new Rectangle();
Point p = parent.getLocationOnScreen();
popupFrameRect.setBounds(p.x,p.y,
parent.getBounds().width,
parent.getBounds().height);
return getHeightAdjust(popupFrameRect,popupRectInScreen);
return 0;
private int getHeightAdjust(Rectangle a, Rectangle b){
if (b.y >= a.y && (b.y + b.height) <= (a.y + a.height))
return 0;
else
return (((b.y + b.height) - (a.y + a.height)) + 5);
private int getWidthAdjust(Rectangle a, Rectangle b){
// System.out.println("width b.x/b.width: " + b.x + "/" + b.width +
//          "a.x/a.width: " + a.x + "/" + a.width);
if (b.x >= a.x && (b.x + b.width) <= (a.x + a.width)){
return 0;
else {
return (((b.x + b.width) - (a.x a.width)) 5);

Similar Messages

  • How do I delete multiple items at once instead of one at a time?

    How do I delete multiple items at once instead of one at a time? I have several duplicate items in my library and would like to delete the duplicates. Thanks!

    You can select multiple items using shift to select a range and control to add or remove items from it.
    Regarding duplciates, Apple's official advice is here... HT2905 - How to find and remove duplicate items in your iTunes library. It is a manual process and the article fails to explain some of the potential pitfalls.
    Use Shift > View > Show Exact Duplicate Items to display duplicates as this is normally a more useful selection. You need to manually select all but one of each group of identical tracks to remove. Sorting the list by Date Added may make it easier to select the appropriate tracks, however this works best when performed immediately after the dupes have been created.  If you have multiple entries in iTunes connected to the same file on the hard drive then don't send to the recycle bin. This can happen, for example, if you start iTunes with a disconnected external drive, then connect it, reimport from your media folder, then restart iTunes.
    Use my DeDuper script if you're not sure, don't want to do it by hand, or want to preserve ratings, play counts and playlist membership. See this thread for background. Please take note of the warning to backup your library before deduping, whether you do so by hand or using my script, in case something goes wrong.
    (If you don't see the menu bar press ALT to show it temporarily or CTRL+B to keep it displayed)
    tt2

  • How can I delete multiple photos at once from the official Photos app?

    Dear fellow Apple users,
    I have many pictures on my Camera Roll in Apple's Photos app. What's the quickest way to delete multiple photos at once?
    Thus far, I know how to delete photos one by one, but that's time-consuming.
    Thank you.

    No not box with arrow, that is share button.  Edit is where it shows in the pic I posted

  • From my music how do i move multiple songs at once to a playlist

    From( My Music) how do I move multiple songs at once to a playlist.
                                        Thanks

    Your issue has nothing to do with Apple networking. You may get better results in getting a solution if your post your issue to the iTunes area of the Apple Support Communities.

  • Is there a way to format multiple images at once? Change colour mode or resolution?

    Is there a way to format multiple images at once? Change colour mode or resolution?

    It's very easy to make an action.
    Go to window > actions
    In the actions panel, simply click the 'create a new action' button, it starts recording as soon as you've created it (when you've given it a name).
    Now you can apply the changes you want to make to the images on the file you have opened.
    After you've done all you need to do. You click the 'stop' button. The action is now ready to use. And you can apply the changes you made on all the other files.
    Then you can continue how gener7 explained.
    I usually include a save and close command, so that the whole batch doesn't end up opened after running the script.
    But if you do that you have to create a new file, and save it to your computer before you start recording the action, otherwise the save command will be replaced by each file. And you'll end up with one edited file in the end. At least for as far as I know!

  • ICloud keeps duplicating my contacts, any of which I need to delete anyways.  Is there a way to delete multiple contacts at once? I  have been deleting them one at a time, but they keep reappearing.

    ICloud keeps duplicating my contacts, any of which I need to delete anyways.  Is there a way to delete multiple contacts at once? I  have been deleting them one at a time, but they keep reappearing.

    I have exactly the same problem!  I have Outlook 2010 and it does the same thing with my contacts, and calender enteries!! Really frustrating

  • Insert data into multiple entities at once using a view object

    Hi,
    I'm trying to insert data into multiple entities at once using a view object, but unfortunately it doesn't seem to work. The two entities have a 1:1 association. I created a view object which contains both entities and I made sure they aren't read-only. But like I said it doesn't work, I can't insert data in both entities at once... :(
    Is this possible? And how (if it is)?

    Hi,
    I'm trying to insert data into multiple entities at once using a view object, but unfortunately it doesn't seem to work. The two entities have a 1:1 association. I created a view object which contains both entities and I made sure they aren't read-only. But like I said it doesn't work, I can't insert data in both entities at once... :(
    Is this possible? And how (if it is)? Peter:
    This is definitely supported and tested. Please send us the exception stack trace. You must running into other problems. A few things to note:
    A) You have to mark the entities as both updateable (not read-only) and not reference-only.
    B) If you're not seeing an exception stack, turn on diagnostic. Here is how:
    To turn on diagnostic, go to the IDE,
    1. Select the project.
    2. Do right mouse click and select "Project Settings..."
    3. On the Settings dialog, select Configurations/Runner.
    4. In the righthand side pane, you should see a textbox for "Java
    Options". Please add the following JVM switch:
    -Djbo.debugoutput=console
    Then, rerun. The run command should include
    -Djbo.debugoutput=console as in
    "D:\JDev9i\jdk\bin\javaw.exe" -Djbo.debugoutput=console -classpath ...
    You should now see a lot more output on the IDE's message window. Here you should see the exception stack trace.
    If you invoking your app directly from command prompt, just add "-Djbo.debugoutput=console" after your "java.exe".
    Thanks.
    Sung

  • How do I apply a preset to multiple images at once?

    I'm almost embarassed to ask this, because it seems so simple. But I'm new to LR and need some help.
    I want to apply a preset (exmample, a preset that resembles film) to multiple images at once. (similar to batch editing in Photoshop) but I want want the white balance etc to necessarily be the same, obviously. Please help!

    Select all of your thumbnails in the develop module film strip or in the library prior to going into develop. Then turn on Auto-Sync. Any adjustment you make to your first image will be repeated on all of the selected images. Or just perfect your first image and choose sync. You will see a pop-up dialog and you can choose exactly which develop settings you wish to sync e.g. white balance only or white balance and other settings.
    To be clear Auto-sync will apply all develop settings on the fly to all selected images.
    Sync will apply the settings from the first selected image to all of the subsequently selected images unless you choose exceptions. For example you may wish to apply exposure, contrast, highlights and shadows from your perfected image but not the crop settings.
    Don't forget to turn off Auto-Sync when you have finished otherwise it will affect future editing.
    P.S. There is no such thing as an embarrassing question. The beginners forum is designed entirely for that purpose.

  • ? Flash CS4, Is it possible to adjust the length of multiple timelines at once?

    Hi,
    I am using Flash CS4. Is there any way to adjust the length of multiple timelines at once? I am doing an animation of leaves falling from a tree. The leaves alone have 17 separate timelines on separate layers plus each has it's own guide layer.
    If I had the ability to to select all of the timelines together and adjust all of their respective start and end times at the same same time, relative to each other as well as separately, life would be so much easier!
    Of course I can do it timeline by timeline, no problem, but I can't seem to adjust the length of more than one timeline at a time. (no pun intended)
    Even when I select more than one timeline, the double arrow only adjusts the length of one timeline. Even each guide layer's length has to be adjusted separately. I understand the benefit of this, but, testing timing and making adjustments would be so much simpler and go so much faster if I could select and drag multiple timeline lengths at the same time.
    Is there any way to do this?
    I'm new to Flash so, thanks in advance for your patience with me!
    SabelV

    Thanks! I had a feeling. It's nice to have the answer. Oh well, now I can get back to work and not waste any more time with that part of the puzzle. You've been very helpful and I'm sure your answer is correct.  Wish I knew how to rate your answer even higher. Thanks again!

  • Assign multiple relationships at once

    Hi everyone...I am working in Primavera P6 Project Management Release: 7.0 Service Pack 3 (Build #: 00033036)
    When trying to assign multiple relationships at once, my computer will not allow me to capture multiple activities that have been assigned as either a predecessor or successor. I can highlight them, but when I click the assign button they all briefly flash as being captured then the assignment only shows the first activity in my complete schedule?
    I am able to log into a co-workers machine with my credentials and perform this task, but not on my machine. Do you have any suggestions?
    Thanks

    Hello,
    I assume this is all in the same project? It sounds like your project profile security settings could be different than your co-workers. I would see if there is a conflict between your settings from the admin perspective.
    Check these two lines in project security profile.
    Edit Project Activity
    Relationships
    Create, edit, and delete a project’s activity
    relationships.
    Add/Edit Project
    Activities Except
    Relationships
    Create and edit a project’s activity information, except
    activity relationships. To edit activity IDs, a user must
    also be granted the Edit Activity ID project privilege.

  • Changing multiple objects at once

    is there a way of setting eg thre end jump for multiple tracks at once - if they all have the same end jump?
    best tommy banana

    Not really, but you can do it another way around...
    Make the first track, set the end jump and hen duplicate the track twice. You do this by clicking on the track in the outline view panel, hold the Apple key, press 'D" on your keyboard.
    The two new tracks should have the same attributes as the original, including the end jump, menu settings and so on. You can then add the different footage to these new tracks.
    But - are you certain you ned two other tracks? Can you not use a single track and put all of your clips into that, then use stories to divide it up?

  • HT1451 when editing info, how do i select multiple items to edit a group? For example, changing the artist name on multiple tracks at once?

    when editing info, how do i select multiple items to edit a group? For example, changing the artist name on multiple tracks at once?

    Same way you select multipl items anywhere else.
    Hold ctrl and click the items you want.
    If they are in consecutive order, click the 1st then Shift click the last.

  • How can I preserve row and column addresses on multiple cells at once in Numbers?

    How can I preserve row and column addresses on multiple cells at once in Numbers 3.2.2? I do a lot of rearranging and sorting and want to reference cells in other sheets. After entering the formulas (example: '=Sheet1::Table 1::H126') I will sort the table and the formulas will not move with the sort.  I think I can fix this by going cell by cell checking the 'preserve row' and 'preserve column' boxes when editing the formula.  I want to avoid having to go one by one.  I know that checking the boxes creates a formula like this: '=Sheet1::Table 1::$H$126'  I have also tried entering this manually and filling down but it doesn't include the preservations (the $$) in the autofill.  If there is another way to remedy my sorting problem that would also be welcomed!
    THANKS!!

    The title of the post is this
    How can I preserve row and column addresses on multiple cells at once in Numbers?
    I restated the Question as follows
    Can "Preserve Row" an / or "Preserve Column" be set on multiple cells at the same time.
    In both cases it is not asked if multiple cells can be set to....
    That is a given.
    Step back a second...  It is like selecting multiple cells and setting the text color of the currently selected cells to red. This can be done. More than one cell at a time modified because they are currently selected.
    Whats is being asked is:  if more than one cell is selected at the same time can the settings "Preserve Row" an / or "Preserve Column" be applied. No table I put up will help with that question.
    YES or NO
    If YES how?

  • Error SocketChannel receive multiple messages at once?

    Hello,
    I use Java NIO, non blocking for my client-server program.
    Everything works ok, until there are many clients that sending messages at the same time to the server.
    The server can identify all the clients, and begin reading, but the reading of those multiple clients are always the same message.
    For example, client A send "Message A", client B send "Missing Message", client C send "Another Missing Message" at the same time to the server, the server read client A send "Message A", client B send "Message A", client C send "Message A", only happen if the server trying to read all those messages at once, if the server read one by one, it's working perfectly.
    What's wrong with my code?
    This is on the server, reading the message:
    private Selector               packetReader; // the selector to read client message
    public void update(long elapsedTime) throws IOException {
      if (packetReader.selectNow() > 0) {
        // message received
        Iterator packetIterator = packetReader.selectedKeys().iterator();
        while (packetIterator.hasNext()) {
          SelectionKey key = (SelectionKey) packetIterator.next();
          packetIterator.remove();
          // there is client sending message, looping until all clients message
          // fully read
          // construct packet
          TCPClient client = (TCPClient) key.attachment();
          try {
            client.read(); // IN HERE ALL THE CLIENTS READ THE SAME MESSAGES
               // if only one client send message, it's working, if there are multiple selector key, the message screwed
          } catch (IOException ex) {
    //      ex.printStackTrace();
            removeClient(client); // something not right, kick this client
    }On the client, I think this is the culprit :
    private ByteBuffer            readBuffer; // the byte buffer
    private SocketChannel  client; // the client SocketChannel
    protected synchronized void read() throws IOException {
      readBuffer.clear();    // clear previous buffer
      int bytesRead = client.read(readBuffer);  // THIS ONE READ THE SAME MESSAGES, I think this is the culprit
      if (bytesRead < 0) {
        throw new IOException("Reached end of stream");
      } else if (bytesRead == 0) {
        return;
      // write to storage (DataInputStream input field storage)
      storage.write(readBuffer.array(), 0, bytesRead);
      // in here the construction of the buffer to real message
    }How could the next client read not from the beginning of the received message but to its actual message (client.read(readBuffer)), i'm thinking to use SocketChannel.read(ByteBuffer[] dsts, , int offset, int length) but don't know the offset, the length, and what's that for :(
    Anyone networking gurus, please help...
    Thank you very much.

    Hello ejp, thanks for the reply.
    (1) You can't assume that each read delivers an entire message.Yep I know about this, like I'm saying everything is okay when all the clients send the message not in the same time, but when the server tries to read client message at the same time, for example there are 3 clients message arrive at the same time and the server tries to read it, the server construct all the message exactly like the first message arrived.
    This is the actual construction of the message, read the length of the packet first, then construct the message into DataInputStream, and read the message from it:
    // packet stream reader
    private DataInputStream input;
    private NewPipedOutputStream storage;
    private boolean     waitingForLength = true;
    private int length;     
    protected synchronized void read() throws IOException {
      readBuffer.clear(); // clear previous byte buffer
      int bytesRead = client.read(readBuffer); // read how many bytes read
      if (bytesRead < 0) {
        throw new IOException("Reached end of stream");
      } else if (bytesRead == 0) {
        return;
      // the bytes read is used to fill the byte buffer
      storage.write(readBuffer.array(), 0, bytesRead);
      // after read the packet
      // this is the message construction
      // write to byte buffer to input storage
      // (this will write into DataInputStream)
      storage.write(readBuffer.array(), 0, bytesRead);
      // unpack the packet
      while (input.available() > 0) {
        // unpack the byte length first
        if (waitingForLength) { // read the packet length first
          if (input.available() > 2) {
            length = input.readShort();
            waitingForLength = false;
          } else {
            // the length has not fully read
            break; // wait until the next read
        // construct the packet if the length already known
        } else {
          if (input.available() >= length) {
            // store the content to data
            byte[] data = new byte[length];
            input.readFully(data);
            // add to received packet
            addReceivedPacket(data);
         waitingForLength = true; // wait for another packet
          } else {
            // the content has not fully read
         break; // wait until next read
    (2) You're sharing the same ByteBuffer between all your clients
    so you're running some considerable risks if (1) doesn't happen.
    I recommend you run a ByteBuffer per client and have a good look
    at its API and the NIO examples.Yep, I already use one ByteBuffer per client, it's not shared among the clients, this is the class for each client:
    private SocketChannel client; // socket channel per client
    private ByteBuffer readBuffer; // byte buffer per client
    private Selector packetReader; // the selector that is shared among all clients
    private static final int BUFFER_SIZE = 10240; // default huge buffer size for reading
    private void init() throws IOException {
      storage; // the packet storage writer
      input; // the actual packet input
      readBuffer = ByteBuffer.allocate(BUFFER_SIZE); // the byte buffer is one per client
      readBuffer.order(ByteOrder.BIG_ENDIAN);
      client.configureBlocking(false);
      client.socket().setTcpNoDelay(true);
      // register packet reader
      // one packetReader used by all clients
      client.register(packetReader, SelectionKey.OP_READ, this);
    }Cos the ByteBuffer is not shared, I think it's impossible that it mixed up with other clients, what I think is the SocketChannel client.read(ByteBuffer) that fill the byte buffer with the same packet?
    So you're probably getting the data all mixed up - you'll probalby be seeing a new client message followed by whatever was there from the last time, or the time before.If the server not trying to read all the messages at the same time, it works fine, I think that if the client SocketChannel filled up with multiple client messages, the SocketChannel.read(...) only read the first client message.
    Or am I doing something wrong, I could fasten the server read by removing the Thread.sleep(100); but I think that's not the good solution, since in NIO there should be time where the server need to read client multiple messages at once.
    Any other thoughts?
    Thanks again.

  • IMporting multiple albums at once: sort on date added AND album or artist

    When importing multiple albums at once, iTunes ads them in the library in an all mixed up order.
    This makes it very annoying to change song info. I have to multi-select songs from the same album (clicking while pressing the control button) and then change stuff.
    1. Why can't iTunes automaticaly keep tracks from the same album together when adding new music from multiple albums?
    2. Why can't we sort by added date AND another column like artist or album?
    any solutions are very welcome
    greetz

    The order iTunes is showing the tracks can be changed. Select the album column heading to get tracks list in album order. Normally within an album the tracks will list in track order when viewing this way.

Maybe you are looking for

  • Problem with error code 401

    Hi I had a problem yesterday with my receiver determination... I had an XICACHE update error along with SAP:AdditionalText>Error when reading HTTP destination: INTEGRATION_DIRECTORY_HMI.</SAP:AdditionalText>   <SAP:ApplicationFaultMessage namespace="

  • Drop down by Index label

    Hi all, I have a "drop down by index" UI element in my webdynpro which is bound to a value node which intern gets values from a model node. Values are visible in the drop down and also are going to the BAPI proprely. But, I want to show an entry simi

  • Can we decrease the datafile size in 8.1.7.4

    Hello All- I have created a sample db with table space with datafile size of 2 GB. I may be needing hundreds of mb only.It is eating up the space on unix box server. Is there any way I can decrease the size of the datafile attached to the tablespace

  • Parent package shouldn't fail irrespective of that child package fails of success..

    Hi friends, I have a small requirement here. we have 10 child packages and one parent package. Calling the child packages from parent. irrespective of that child package fails of success , parent package should pick the next package.. EX.. Parent pac

  • Info. Record (Ref: Q3_2)

    Dear Sirs, Could you answer me the following question ? If Info. Record is created / updated from PO, there is no condition record in the Info. Record. Is it correct ? If Info. Record is created / updated from other documents such as RFQ, Quotation,