/* * DBeaver - Universal Database Manager * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org) * * Licensed 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.jkiss.dbeaver.model.navigator; import org.eclipse.core.resources.IProject; import org.jkiss.dbeaver.model.messages.ModelMessages; import org.jkiss.dbeaver.model.DBPImage; import org.jkiss.dbeaver.model.app.DBPProjectListener; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.utils.ArrayUtils; import java.util.*; /** * DBNRoot */ public class DBNRoot extends DBNNode implements DBNContainer, DBPProjectListener { private final DBNModel model; private DBNProject[] projects = new DBNProject[0]; public DBNRoot(DBNModel model) { super(); this.model = model; model.getPlatform().getProjectManager().addProjectListener(this); } @Override void dispose(boolean reflect) { for (DBNProject project : projects) { project.dispose(reflect); } projects = new DBNProject[0]; model.getPlatform().getProjectManager().removeProjectListener(this); } @Override public DBNModel getModel() { return model; } @Override public String getNodeType() { return ModelMessages.model_navigator_Root; } @Override public Object getValueObject() { return this; } @Override public String getChildrenType() { return ModelMessages.model_navigator_Project; } @Override public Class<IProject> getChildrenClass() { return IProject.class; } @Override public String getNodeName() { return "#root"; //$NON-NLS-1$ } @Override public String getNodeDescription() { return ModelMessages.model_navigator_Model_root; } @Override public DBPImage getNodeIcon() { return null; } @Override public boolean allowsChildren() { return projects.length > 0; } @Override public DBNProject[] getChildren(DBRProgressMonitor monitor) { return projects; } public DBNProject[] getProjects() { return projects; } @Override public boolean allowsOpen() { return true; } @Override public String getNodeItemPath() { return null; } public DBNProject getProject(IProject project) { for (DBNProject node : projects) { if (node.getProject() == project) { return node; } } return null; } DBNProject addProject(IProject project, boolean reflect) { DBNProject projectNode = new DBNProject( this, project, model.getPlatform().getProjectManager().getResourceHandler(project)); projects = ArrayUtils.add(DBNProject.class, projects, projectNode); Arrays.sort(projects, new Comparator<DBNProject>() { @Override public int compare(DBNProject o1, DBNProject o2) { return o1.getNodeName().compareTo(o2.getNodeName()); } }); model.fireNodeEvent(new DBNEvent(this, DBNEvent.Action.ADD, projectNode)); return projectNode; } void removeProject(IProject project) { for (int i = 0; i < projects.length; i++) { DBNProject projectNode = projects[i]; if (projectNode.getProject() == project) { projects = ArrayUtils.remove(DBNProject.class, projects, i); model.fireNodeEvent(new DBNEvent(this, DBNEvent.Action.REMOVE, projectNode)); projectNode.dispose(true); break; } } } @Override public void handleActiveProjectChange(IProject oldValue, IProject newValue) { DBNProject projectNode = getProject(newValue); DBNProject oldProjectNode = getProject(oldValue); if (projectNode != null) { model.fireNodeEvent(new DBNEvent(this, DBNEvent.Action.UPDATE, projectNode)); } if (oldProjectNode != null) { model.fireNodeEvent(new DBNEvent(this, DBNEvent.Action.UPDATE, oldProjectNode)); } } }