/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.log4j.chainsaw;

import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.Action;

import org.apache.log4j.chainsaw.help.HelpManager;


/**
 * @author psmith
 *
 */
class CommonActions
{
    private static CommonActions instance = null;
    private static Action SHOW_RELEASE_NOTE; 
    
    
    private void initActions() {
        SHOW_RELEASE_NOTE = new AbstractAction("Release Notes") {

            public void actionPerformed(ActionEvent e)
            {
                HelpManager.getInstance().setHelpURL(ChainsawConstants.RELEASE_NOTES_URL);
                
            }};
    }
    
    static synchronized CommonActions getInstance() {
        if(instance==null) {
            instance = new CommonActions();
        }
        return instance;
    }
    
    /**
     * 
     */
    private CommonActions()
    {
        initActions();
    }

    /**
     * @return
     */
    public Action getShowReleaseNotes()
    {
        return SHOW_RELEASE_NOTE;
    }

}
