/* *******************************************************************
 * Copyright (c) 1999-2001 Xerox Corporation, 
 *               2002 Palo Alto Research Center, Incorporated (PARC).
 * All rights reserved. 
 * This program and the accompanying materials are made available 
 * under the terms of the Common Public License v1.0 
 * which accompanies this distribution and is available at 
 * http://www.eclipse.org/legal/cpl-v10.html 
 *  
 * Contributors: 
 *     Xerox/PARC     initial implementation 
 * ******************************************************************/


package org.aspectj.ajde.ui.swing;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.io.File;
import java.util.ArrayList;

import javax.swing.*;
import javax.swing.border.*;

import org.aspectj.ajde.Ajde;
import org.aspectj.ajde.ui.*;
import org.aspectj.asm.*;

public class SimpleStructureViewToolPanel extends JPanel {

	private StructureView currentView;
	private JButton separator_button = new JButton();
	private boolean hideNonAJEnabled = false;
	private boolean hideAssociationsEnabled = false;
	private boolean sortEnabled = false;

    Border border1;
    Border border2;
    JButton structureView_button = new JButton();
    JPanel label_panel = new JPanel();
    JLabel currConfig_field = new JLabel();
    JPanel spacer_panel = new JPanel();
    JPanel jPanel2 = new JPanel();
    JButton forward_button = new JButton();
    JPanel navigation_panel = new JPanel();
    JButton back_button = new JButton();
    BorderLayout borderLayout1 = new BorderLayout();
    JPanel buttons_panel = new JPanel();
    BorderLayout borderLayout2 = new BorderLayout();
    BorderLayout borderLayout3 = new BorderLayout();
    BorderLayout borderLayout4 = new BorderLayout();

    public final IHierarchyListener MODEL_LISTENER = new IHierarchyListener() {
        public void elementsUpdated(IHierarchy model) {
			String path = Ajde.getDefault().getConfigurationManager().getActiveConfigFile();
			String fileName = "<no active config>"; 
			if (path != null) fileName = new File(path).getName();
			updateCurrConfigLabel(fileName);
        }
    };
    
    JButton hideNonAJ_button = new JButton();
    JPanel navigation_panel1 = new JPanel();
    JButton hideAssociations_button = new JButton();
    BorderLayout borderLayout5 = new BorderLayout();
    JButton sort_button = new JButton();

	public SimpleStructureViewToolPanel(StructureView currentView) {
		this.currentView = currentView;
		Ajde.getDefault().getStructureModelManager().addListener(MODEL_LISTENER);
		try {
			jbInit();
		} catch (Exception e) {
			Ajde.getDefault().getErrorHandler().handleError("Could not initialize GUI.", e);
		}
		updateCurrConfigLabel("<no active config>");
	}
  
    private void updateCurrConfigLabel(String text) {
    	currConfig_field.setText("  File View (" + text + ")");
    }

	private void jbInit() throws Exception {
        border1 = BorderFactory.createBevelBorder(BevelBorder.LOWERED,Color.white,Color.white,new Color(156, 156, 158),new Color(109, 109, 110));
        border2 = BorderFactory.createEmptyBorder(0,1,0,0);



        separator_button.setPreferredSize(new Dimension(2, 16));
        separator_button.setMinimumSize(new Dimension(2, 16));
        separator_button.setEnabled(false);
        separator_button.setBorder(AjdeWidgetStyles.DEFAULT_BORDER);
        separator_button.setMaximumSize(new Dimension(2, 16));


        structureView_button.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(ActionEvent e) {
                structureView_button_actionPerformed(e);
            }
        });
        structureView_button.setIcon(AjdeUIManager.getDefault().getIconRegistry().getStructureViewIcon());
        structureView_button.setBorder(border2);
        structureView_button.setToolTipText("Navigate back");
        structureView_button.setPreferredSize(new Dimension(20, 20));
        structureView_button.setMinimumSize(new Dimension(20, 20));
        structureView_button.setMaximumSize(new Dimension(24, 20));
        currConfig_field.setBackground(SystemColor.control);
        currConfig_field.setFont(new java.awt.Font("SansSerif", 0, 11));
        currConfig_field.setBorder(AjdeWidgetStyles.DEFAULT_BORDER);
        //currConfig_field.setEditable(false);
        currConfig_field.setText("     ");

        forward_button.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(ActionEvent e) {
                forward_button_actionPerformed(e);
            }
        });
        forward_button.setIcon(AjdeUIManager.getDefault().getIconRegistry().getForwardIcon());
        forward_button.setToolTipText("Navigate forward");
        forward_button.setPreferredSize(new Dimension(20, 20));
        forward_button.setMinimumSize(new Dimension(20, 20));
        forward_button.setMaximumSize(new Dimension(24, 20));
        forward_button.setBorder(AjdeWidgetStyles.DEFAULT_BORDER);
        navigation_panel.setLayout(borderLayout1);
        back_button.setMaximumSize(new Dimension(24, 20));
        back_button.setMinimumSize(new Dimension(20, 20));
        back_button.setPreferredSize(new Dimension(20, 20));
        back_button.setToolTipText("Navigate back");
        back_button.setIcon(AjdeUIManager.getDefault().getIconRegistry().getBackIcon());
        back_button.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(ActionEvent e) {
                back_button_actionPerformed(e);
            }
        });
        back_button.setBorder(AjdeWidgetStyles.DEFAULT_BORDER);
        this.setLayout(borderLayout2);
        buttons_panel.setLayout(borderLayout3);
        label_panel.setLayout(borderLayout4);
        hideNonAJ_button.setBorder(AjdeWidgetStyles.DEFAULT_BORDER);
        hideNonAJ_button.setMaximumSize(new Dimension(24, 20));
        hideNonAJ_button.setMinimumSize(new Dimension(20, 20));
        hideNonAJ_button.setPreferredSize(new Dimension(20, 20));
        hideNonAJ_button.setToolTipText("Hide non-AspectJ members");
        hideNonAJ_button.setIcon(AjdeUIManager.getDefault().getIconRegistry().getHideNonAJIcon());
        hideNonAJ_button.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(ActionEvent e) {
                hideNonAJ_button_actionPerformed(e);
            }
        });
        navigation_panel1.setLayout(borderLayout5);
        hideAssociations_button.setMaximumSize(new Dimension(24, 20));
        hideAssociations_button.setMinimumSize(new Dimension(20, 20));
        hideAssociations_button.setPreferredSize(new Dimension(20, 20));
        hideAssociations_button.setToolTipText("Hide associations");
        hideAssociations_button.setIcon(AjdeUIManager.getDefault().getIconRegistry().getHideAssociationsIcon());
        hideAssociations_button.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(ActionEvent e) {
                hideAssociations_button_actionPerformed(e);
            }
        });
        hideAssociations_button.setBorder(AjdeWidgetStyles.DEFAULT_BORDER);
        sort_button.setBorder(AjdeWidgetStyles.DEFAULT_BORDER);
        sort_button.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(ActionEvent e) {
                sort_button_actionPerformed(e);
            }
        });
        sort_button.setIcon(AjdeUIManager.getDefault().getIconRegistry().getOrderIcon());
        sort_button.setToolTipText("Sort member");
        sort_button.setPreferredSize(new Dimension(20, 20));
        sort_button.setMinimumSize(new Dimension(20, 20));
        sort_button.setMaximumSize(new Dimension(24, 20));
        label_panel.add(currConfig_field,  BorderLayout.CENTER);
        //label_panel.add(structureView_button,  BorderLayout.WEST);
        this.add(spacer_panel,  BorderLayout.CENTER);
        this.add(buttons_panel,  BorderLayout.EAST);
        buttons_panel.add(navigation_panel, BorderLayout.CENTER);
        navigation_panel.add(back_button, BorderLayout.CENTER);
        navigation_panel.add(forward_button, BorderLayout.EAST);
        navigation_panel.add(jPanel2, BorderLayout.WEST);
        buttons_panel.add(navigation_panel1,  BorderLayout.WEST);
        navigation_panel1.add(hideAssociations_button,  BorderLayout.EAST);
        navigation_panel1.add(hideNonAJ_button,  BorderLayout.CENTER);
        navigation_panel1.add(sort_button,  BorderLayout.WEST);
        this.add(label_panel,  BorderLayout.WEST);


	}

    private void forward_button_actionPerformed(ActionEvent e) {
		Ajde.getDefault().getStructureViewManager().fireNavigateForwardAction(currentView);
    }

    private void back_button_actionPerformed(ActionEvent e) {
		Ajde.getDefault().getStructureViewManager().fireNavigateBackAction(currentView);
    }

    void structureView_button_actionPerformed(ActionEvent e) {

    }

    private void hideNonAJ_button_actionPerformed(ActionEvent e) {
		if (hideNonAJEnabled) {
			hideNonAJ_button.setBorder(AjdeWidgetStyles.DEFAULT_BORDER);
			hideNonAJEnabled = false;
			currentView.getViewProperties().setFilteredMemberKinds(new ArrayList());
		} else {
			hideNonAJ_button.setBorder(AjdeWidgetStyles.LOWERED_BEVEL_BORDER);
			hideNonAJEnabled = true;
			currentView.getViewProperties().setFilteredMemberKinds(
				IProgramElement.Kind.getNonAJMemberKinds()
			);
		}
		Ajde.getDefault().getStructureViewManager().refreshView(currentView);
    }

    private void hideAssociations_button_actionPerformed(ActionEvent e) {
		if (hideAssociationsEnabled) {
			hideAssociations_button.setBorder(AjdeWidgetStyles.DEFAULT_BORDER);
			hideAssociationsEnabled = false;
			currentView.getViewProperties().setRelations(
				Ajde.getDefault().getStructureViewManager().getAvailableRelations()
			);
		} else {
			hideAssociations_button.setBorder(AjdeWidgetStyles.LOWERED_BEVEL_BORDER);
			hideAssociationsEnabled = true;
			currentView.getViewProperties().setRelations(new ArrayList());
		}
		Ajde.getDefault().getStructureViewManager().refreshView(currentView);
    }

    private void sort_button_actionPerformed(ActionEvent e) {
		if (sortEnabled) {
			sort_button.setBorder(AjdeWidgetStyles.DEFAULT_BORDER);
			sortEnabled = false;
			currentView.getViewProperties().setSorting(
				StructureViewProperties.Sorting.DECLARATIONAL
			);
		} else {
			sort_button.setBorder(AjdeWidgetStyles.LOWERED_BEVEL_BORDER);
			sortEnabled = true;
			currentView.getViewProperties().setSorting(
				StructureViewProperties.Sorting.ALPHABETICAL
			);
		}
		Ajde.getDefault().getStructureViewManager().refreshView(currentView);
    }
}
