/*
 NeoDatis ODB : Native Object Database (odb.info@neodatis.org)
 Copyright (C) 2007 NeoDatis Inc. http://www.neodatis.org

 "This file is part of the NeoDatis ODB open source object database".

 NeoDatis ODB is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public
 License as published by the Free Software Foundation; either
 version 2.1 of the License, or (at your option) any later version.

 NeoDatis ODB is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 Lesser General Public License for more details.

 You should have received a copy of the GNU Lesser General Public
 License along with this library; if not, write to the Free Software
 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */
package org.neodatis.odb.gui.objectbrowser.hierarchy;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.border.EmptyBorder;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;

import org.neodatis.odb.OID;
import org.neodatis.odb.core.layers.layer2.meta.ClassInfo;
import org.neodatis.odb.core.layers.layer2.meta.NonNativeObjectInfo;
import org.neodatis.odb.core.layers.layer3.IStorageEngine;
import org.neodatis.odb.gui.IBrowserContainer;
import org.neodatis.odb.gui.Messages;
import org.neodatis.odb.gui.objectbrowser.update.ObjectIntrospectorPanel;
import org.neodatis.tool.ILogger;

public class HierarchicObjectBrowserPanel extends JPanel implements ActionListener, TreeSelectionListener {
	private ClassInfo ci;
	private List objectValues;
	private JTree tree;
	private ObjectBrowserModel model;
	JButton btDeleteObject;
	JButton btUpdateObject;
	JPanel updatePanel;
	private ILogger logger;

	private boolean isEditing;
	private NativeAttributeValueWrapper attributeBeingEdited;
	private NonNativeObjectInfoWrapper objectBeingEdited;
	private NonNativeObjectInfoWrapper selectedObject;
	private OID selectedOid;
	private IStorageEngine engine;
	private IBrowserContainer browser;

	public HierarchicObjectBrowserPanel(IBrowserContainer browser, IStorageEngine engine, ClassInfo ci, List objectValues,
			boolean withButtons, ILogger logger) {
		super();
		this.ci = ci;
		this.objectValues = objectValues;
		isEditing = false;
		attributeBeingEdited = null;
		this.engine = engine;
		this.browser = browser;
		this.logger = logger;
		initGUI(withButtons);
	}

	private void initGUI(boolean withButtons) {
		setBorder(new EmptyBorder(4, 4, 4, 4));
		setLayout(new BorderLayout(4, 4));
		TreeNode root = new DefaultMutableTreeNode(ci.getFullClassName());
		model = new ObjectBrowserModel(ci, objectValues, root);
		tree = new JTree(model);
		tree.addTreeSelectionListener(this);
		/*
		 * String os = System.getProperty("os.name"); // Bug or problem on Mac
		 * OS with setLargeModel if(!os.startsWith("Mac")){
		 * tree.setLargeModel(true); }
		 */
		tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
		JScrollPane scrollPane = new JScrollPane(tree);
		scrollPane.setPreferredSize(new Dimension(200, 200));
		add(scrollPane);
		updatePanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
		btDeleteObject = new JButton(Messages.getString("Delete Object"));
		btUpdateObject = new JButton(Messages.getString("Update/Introspect Object"));
		btDeleteObject.setActionCommand("delete-object");
		btUpdateObject.setActionCommand("update-object");

		btDeleteObject.addActionListener(this);
		btUpdateObject.addActionListener(this);

		updatePanel.add(btUpdateObject);
		updatePanel.add(btDeleteObject);

		enableUpdateButton(false);
		if (withButtons) {
			add(updatePanel, BorderLayout.SOUTH);
		}
	}

	private void enableUpdateButton(boolean enable) {
		btDeleteObject.setEnabled(enable);
		btUpdateObject.setEnabled(enable);
	}

	private void showUpdateButton(boolean yes) {
		btDeleteObject.setVisible(yes);
		btUpdateObject.setVisible(yes);
		if (yes) {
			enableUpdateButton(true);
		}
	}

	private void enableUpdateFields(boolean enable) {
		updatePanel.invalidate();
	}

	private void showUpdateFields(boolean visible) {
		showUpdateButton(!visible);
	}

	public void actionPerformed(ActionEvent e) {
		String actionCommand = e.getActionCommand();

		if (actionCommand.equals("delete-object")) {
			deleteObject();
			return;
		}

		if (actionCommand.equals("update-object")) {
			updateObject();
			return;
		}

	}

	private void updateObject() {

		ObjectIntrospectorPanel panel = new ObjectIntrospectorPanel(engine, ci, browser, selectedObject.getNnoi(), logger);
		browser.browse("Updating object", panel, -1);

	}

	private void deleteObject() {

		NonNativeObjectInfo nnoi = selectedObject.getNnoi();
		System.out.println("Deleting object with id " + selectedObject.getNnoi().getOid());
		try {
			int r = JOptionPane.showConfirmDialog(this, Messages.getString("Delete object of type ")
					+ nnoi.getClassInfo().getFullClassName() + Messages.getString(" with id ") + nnoi.getOid(), Messages
					.getString("Confirm Deletion"), JOptionPane.YES_NO_OPTION);
			if (r == JOptionPane.OK_OPTION) {
				engine.deleteObjectWithOid(selectedObject.getNnoi().getOid(),false);
				TreePath tp = tree.getSelectionModel().getLeadSelectionPath();
				System.out.println("delete done!");
				System.out.println(tp);
				selectedObject.setDeleted(true);
				tree.expandPath(tp);
				tree.collapsePath(tp);
				enableUpdateButton(false);
			}
		} catch (Exception e) {
			JOptionPane.showMessageDialog(this, Messages.getString("Error while deleting object (" + e.getMessage() + ")"));
		}

	}

	public void valueChanged(TreeSelectionEvent e) {
		Object object = tree.getLastSelectedPathComponent();
		TreePath tp = tree.getSelectionPath();

		if (object != null) {
			/*
			 * if(object instanceof NativeAttributeValueWrapper){
			 * objectBeingEdited = (NonNativeObjectInfoWrapper)
			 * tp.getParentPath().getLastPathComponent();
			 * showUpdateFields(true); startEditing(object); }
			 */

			if (object instanceof NonNativeObjectInfoWrapper && tp.getPathCount() == 2) {
				selectedObject = (NonNativeObjectInfoWrapper) object;
				selectedOid = selectedObject.getNnoi().getOid();
				if (!selectedObject.isDeleted()) {
					btDeleteObject.setText(Messages.getString("Delete object with oid ") + selectedObject.getNnoi().getOid());
					btUpdateObject.setText(Messages.getString("Update object with oid ") + selectedObject.getNnoi().getOid());
					showUpdateFields(false);
				} else {
					btDeleteObject.setText(Messages.getString("Delete ..."));
					enableUpdateButton(false);
				}

			}
		}
	}

	public OID getSelectedOid() {
		return selectedOid;
	}
}

 

Ads help maintain this website.