diff --git a/modules/FiltersImpl/src/main/java/org/gephi/filters/FilterControllerImpl.java b/modules/FiltersImpl/src/main/java/org/gephi/filters/FilterControllerImpl.java index 1a1038b05b62a60ee9a24f3f28c4202fb1c5e597..00e1caa89f292270a01a4ba71b3398c8295b7f33 100644 --- a/modules/FiltersImpl/src/main/java/org/gephi/filters/FilterControllerImpl.java +++ b/modules/FiltersImpl/src/main/java/org/gephi/filters/FilterControllerImpl.java @@ -1,419 +1,419 @@ -/* - Copyright 2008-2010 Gephi - Authors : Mathieu Bastian - Website : http://www.gephi.org - - This file is part of Gephi. - - DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. - - Copyright 2011 Gephi Consortium. All rights reserved. - - The contents of this file are subject to the terms of either the GNU - General Public License Version 3 only ("GPL") or the Common - Development and Distribution License("CDDL") (collectively, the - "License"). You may not use this file except in compliance with the - License. You can obtain a copy of the License at - http://gephi.org/about/legal/license-notice/ - or /cddl-1.0.txt and /gpl-3.0.txt. See the License for the - specific language governing permissions and limitations under the - License. When distributing the software, include this License Header - Notice in each file and include the License files at - /cddl-1.0.txt and /gpl-3.0.txt. If applicable, add the following below the - License Header, with the fields enclosed by brackets [] replaced by - your own identifying information: - "Portions Copyrighted [year] [name of copyright owner]" - - If you wish your version of this file to be governed by only the CDDL - or only the GPL Version 3, indicate your decision by adding - "[Contributor] elects to include this software in this distribution - under the [CDDL or GPL Version 3] license." If you do not indicate a - single choice of license, a recipient has the option to distribute - your version of this file under either the CDDL, the GPL Version 3 or - to extend the choice of license to its licensees as provided above. - However, if you add GPL Version 3 code and therefore, elected the GPL - Version 3 license, then the option applies only if the new code is - made subject to such option by the copyright holder. - - Contributor(s): - - Portions Copyrighted 2011 Gephi Consortium. - */ -package org.gephi.filters; - -import java.beans.PropertyEditorManager; -import org.gephi.data.attributes.api.AttributeColumn; -import org.gephi.data.attributes.api.AttributeController; -import org.gephi.data.attributes.api.AttributeModel; -import org.gephi.data.attributes.api.AttributeOrigin; -import org.gephi.data.attributes.api.AttributeType; -import org.gephi.filters.api.FilterController; -import org.gephi.filters.api.FilterModel; -import org.gephi.filters.api.PropertyExecutor; -import org.gephi.filters.api.Query; -import org.gephi.filters.api.Range; -import org.gephi.filters.FilterThread.PropertyModifier; -import org.gephi.filters.spi.*; -import org.gephi.graph.api.Edge; -import org.gephi.graph.api.Graph; -import org.gephi.graph.api.GraphController; -import org.gephi.graph.api.GraphModel; -import org.gephi.graph.api.GraphView; -import org.gephi.graph.api.HierarchicalGraph; -import org.gephi.graph.api.Node; -import org.gephi.project.api.ProjectController; -import org.gephi.utils.progress.Progress; -import org.gephi.utils.progress.ProgressTicket; -import org.gephi.utils.progress.ProgressTicketProvider; -import org.gephi.project.api.Workspace; -import org.gephi.project.api.WorkspaceInformation; -import org.gephi.project.api.WorkspaceListener; -import org.gephi.visualization.api.VisualizationController; -import org.openide.util.Lookup; -import org.openide.util.lookup.ServiceProvider; -import org.openide.util.lookup.ServiceProviders; - -/** - * - * @author Mathieu Bastian - */ -@ServiceProviders({ - @ServiceProvider(service = FilterController.class), - @ServiceProvider(service = PropertyExecutor.class)}) -public class FilterControllerImpl implements FilterController, PropertyExecutor { - - private FilterModelImpl model; - - public FilterControllerImpl() { - //Register range editor - PropertyEditorManager.registerEditor(Range.class, RangePropertyEditor.class); - PropertyEditorManager.registerEditor(AttributeColumn.class, AttributeColumnPropertyEditor.class); - - //Model management - ProjectController pc = Lookup.getDefault().lookup(ProjectController.class); - pc.addWorkspaceListener(new WorkspaceListener() { - - public void initialize(Workspace workspace) { - workspace.add(new FilterModelImpl(workspace)); - } - - public void select(Workspace workspace) { - model = (FilterModelImpl) workspace.getLookup().lookup(FilterModel.class); - if (model == null) { - model = new FilterModelImpl(workspace); - workspace.add(model); - } - } - - public void unselect(Workspace workspace) { - } - - public void close(Workspace workspace) { - FilterModelImpl m = (FilterModelImpl) workspace.getLookup().lookup(FilterModel.class); - if (m != null) { - m.destroy(); - } - } - - public void disable() { - GraphModel graphModel = Lookup.getDefault().lookup(GraphController.class).getModel(); - if (model != null && model.getCurrentResult() != null && graphModel != null) { - graphModel.destroyView(model.getCurrentResult()); - model.setCurrentResult(null); - } - model = null; - } - }); - if (pc.getCurrentWorkspace() != null) { - Workspace workspace = pc.getCurrentWorkspace(); - model = (FilterModelImpl) workspace.getLookup().lookup(FilterModel.class); - if (model == null) { - model = new FilterModelImpl(workspace); - workspace.add(model); - } - } - } - - public Query createQuery(Filter filter) { - if (filter instanceof Operator) { - return new OperatorQueryImpl((Operator) filter); - } - return new FilterQueryImpl(filter); - } - - public void add(Query query) { - AbstractQueryImpl absQuery = ((AbstractQueryImpl) query); - absQuery = absQuery.getRoot(); - if (!model.hasQuery(absQuery)) { - model.addFirst(absQuery); - - //Init filters with default graph - Graph graph = null; - if (model != null && model.getGraphModel() != null) { - graph = model.getGraphModel().getGraph(); - } else { - GraphModel graphModel = Lookup.getDefault().lookup(GraphController.class).getModel(); - graph = graphModel.getGraph(); - } - - for (Query q : query.getDescendantsAndSelf()) { - Filter filter = q.getFilter(); - if (filter instanceof NodeFilter || filter instanceof EdgeFilter || filter instanceof AttributableFilter) { - FilterProcessor filterProcessor = new FilterProcessor(); - filterProcessor.init(filter, graph); - } - } - } - } - - public void remove(Query query) { - if (model.getCurrentQuery() == query) { - if (model.isSelecting()) { - selectVisible(null); - } else { - filterVisible(null); - } - } - query = ((AbstractQueryImpl) query).getRoot(); - model.remove(query); - } - - public void rename(Query query, String name) { - model.rename(query, name); - } - - public void setSubQuery(Query query, Query subQuery) { - //Init subquery when new filter - if (subQuery.getParent() == null && subQuery != model.getCurrentQuery()) { - Graph graph = null; - if (model != null && model.getGraphModel() != null) { - graph = model.getGraphModel().getGraph(); - } else { - GraphModel graphModel = Lookup.getDefault().lookup(GraphController.class).getModel(); - graph = graphModel.getGraph(); - } - Filter filter = subQuery.getFilter(); - if (filter instanceof NodeFilter || filter instanceof EdgeFilter || filter instanceof AttributableFilter) { - FilterProcessor filterProcessor = new FilterProcessor(); - filterProcessor.init(filter, graph); - } - } - - model.setSubQuery(query, subQuery); - } - - public void removeSubQuery(Query query, Query parent) { - model.removeSubQuery(query, parent); - } - - public void filterVisible(Query query) { - if (query != null && model.getCurrentQuery() == query && model.isFiltering()) { - return; - } - model.setFiltering(query != null); - model.setCurrentQuery(query); - - if (model.getFilterThread() != null) { - model.getFilterThread().setRunning(false); - model.setFilterThread(null); - } - if (query != null) { - FilterThread filterThread = new FilterThread(model); - model.setFilterThread(filterThread); - filterThread.setRootQuery((AbstractQueryImpl) query); - filterThread.start(); - } else { - model.getGraphModel().setVisibleView(null); - if (model.getCurrentResult() != null) { - model.getGraphModel().destroyView(model.getCurrentResult()); - model.setCurrentResult(null); - } - } - } - - public GraphView filter(Query query) { - FilterProcessor processor = new FilterProcessor(); - GraphModel graphModel = Lookup.getDefault().lookup(GraphController.class).getModel(); - Graph result = processor.process((AbstractQueryImpl) query, graphModel); - return result.getView(); - } - - public void selectVisible(Query query) { - if (query != null && model.getCurrentQuery() == query && model.isSelecting()) { - return; - } - model.setSelecting(query != null); - model.setCurrentQuery(query); - - if (model.getFilterThread() != null) { - model.getFilterThread().setRunning(false); - model.setFilterThread(null); - } - - model.getGraphModel().setVisibleView(null); - if (model.getCurrentResult() != null) { - model.getGraphModel().destroyView(model.getCurrentResult()); - model.setCurrentResult(null); - } - - if (query != null) { - FilterThread filterThread = new FilterThread(model); - model.setFilterThread(filterThread); - filterThread.setRootQuery((AbstractQueryImpl) query); - filterThread.start(); - } else { - VisualizationController visController = Lookup.getDefault().lookup(VisualizationController.class); - if (visController != null) { - visController.selectNodes(null); - } - } - } - - public void exportToColumn(String title, Query query) { - HierarchicalGraph result; - if (model.getCurrentQuery() == query) { - GraphView view = model.getCurrentResult(); - if (view != null) { - return; - } - result = model.getGraphModel().getHierarchicalGraph(view); - } else { - FilterProcessor processor = new FilterProcessor(); - GraphModel graphModel = Lookup.getDefault().lookup(GraphController.class).getModel(); - result = (HierarchicalGraph) processor.process((AbstractQueryImpl) query, graphModel); - } - AttributeModel am = Lookup.getDefault().lookup(AttributeController.class).getModel(); - AttributeColumn nodeCol = am.getNodeTable().getColumn("filter_" + title); - if (nodeCol == null) { - nodeCol = am.getNodeTable().addColumn("filter_" + title, title, AttributeType.BOOLEAN, AttributeOrigin.COMPUTED, Boolean.FALSE); - } - AttributeColumn edgeCol = am.getEdgeTable().getColumn("filter_" + title); - if (edgeCol == null) { - edgeCol = am.getEdgeTable().addColumn("filter_" + title, title, AttributeType.BOOLEAN, AttributeOrigin.COMPUTED, Boolean.FALSE); - } - result.readLock(); - for (Node n : result.getNodes()) { - n.getNodeData().getAttributes().setValue(nodeCol.getIndex(), Boolean.TRUE); - } - for (Edge e : result.getEdgesAndMetaEdges()) { - e.getEdgeData().getAttributes().setValue(edgeCol.getIndex(), Boolean.TRUE); - } - result.readUnlock(); - //StatusDisplayer.getDefault().setStatusText(NbBundle.getMessage(FilterControllerImpl.class, "FilterController.exportToColumn.status", title)); - } - - public void exportToNewWorkspace(Query query) { - HierarchicalGraph result; - if (model.getCurrentQuery() == query) { - GraphView view = model.getCurrentResult(); - if (view == null) { - return; - } - result = model.getGraphModel().getHierarchicalGraph(view); - } else { - FilterProcessor processor = new FilterProcessor(); - GraphModel graphModel = Lookup.getDefault().lookup(GraphController.class).getModel(); - result = (HierarchicalGraph) processor.process((AbstractQueryImpl) query, graphModel); - } - - final HierarchicalGraph graphView = result; - new Thread(new Runnable() { - - public void run() { - ProgressTicketProvider progressProvider = Lookup.getDefault().lookup(ProgressTicketProvider.class); - ProgressTicket ticket = null; - if (progressProvider != null) { - ticket = progressProvider.createTicket("Export to workspace", null); - } - Progress.start(ticket); - ProjectController pc = Lookup.getDefault().lookup(ProjectController.class); - Workspace newWorkspace = pc.duplicateWorkspace(pc.getCurrentWorkspace()); - GraphModel graphModel = Lookup.getDefault().lookup(GraphController.class).getModel(newWorkspace); - graphModel.clear(); - graphModel.pushFrom(graphView); - Progress.finish(ticket); - String workspaceName = newWorkspace.getLookup().lookup(WorkspaceInformation.class).getName(); - //StatusDisplayer.getDefault().setStatusText(NbBundle.getMessage(FilterControllerImpl.class, "FilterController.exportToNewWorkspace.status", workspaceName)); - } - }, "Export filter to workspace").start(); - } - - public void exportToLabelVisible(Query query) { - HierarchicalGraph result; - if (model.getCurrentQuery() == query) { - GraphView view = model.getCurrentResult(); - if (view == null) { - return; - } - result = model.getGraphModel().getHierarchicalGraph(view); - } else { - FilterProcessor processor = new FilterProcessor(); - result = (HierarchicalGraph) processor.process((AbstractQueryImpl) query, model.getGraphModel()); - } - HierarchicalGraph fullHGraph = model.getGraphModel().getHierarchicalGraph(); - fullHGraph.readLock(); - for (Node n : fullHGraph.getNodes()) { - boolean inView = n.getNodeData().getNode(result.getView().getViewId()) != null; - n.getNodeData().getTextData().setVisible(inView); - } - for (Edge e : fullHGraph.getEdgesAndMetaEdges()) { - boolean inView = result.contains(e); - e.getEdgeData().getTextData().setVisible(inView); - } - fullHGraph.readUnlock(); - } - - public void setAutoRefresh(boolean autoRefresh) { - if (model != null) { - model.setAutoRefresh(autoRefresh); - } - } - - public void setCurrentQuery(Query query) { - if (model != null) { - model.setCurrentQuery(query); - } - } - - public FilterModel getModel() { - return model; - } - - public synchronized FilterModel getModel(Workspace workspace) { - FilterModel filterModel = workspace.getLookup().lookup(FilterModel.class); - if (filterModel == null) { - filterModel = new FilterModelImpl(workspace); - workspace.add(filterModel); - } - return filterModel; - } - - public void setValue(FilterProperty property, Object value, Callback callback) { - if (model != null) { - Query query = model.getQuery(property.getFilter()); - if (query == null) { - callback.setValue(value); - return; - } - AbstractQueryImpl rootQuery = ((AbstractQueryImpl) query).getRoot(); - FilterThread filterThread = null; - if ((filterThread = model.getFilterThread()) != null && model.getCurrentQuery() == rootQuery) { - if (Thread.currentThread().equals(filterThread)) { - //Called inside of the thread, in init for instance. Update normally. - callback.setValue(value); - model.updateParameters(query); - } else { - //The query is currently being filtered by the thread, or finished to do it - filterThread.addModifier(new PropertyModifier(query, property, value, callback)); - filterThread.setRootQuery(rootQuery); - } - } else { - //Update normally - callback.setValue(value); - model.updateParameters(query); - } - } else { - callback.setValue(value); - } - } -} +/* + Copyright 2008-2010 Gephi + Authors : Mathieu Bastian + Website : http://www.gephi.org + + This file is part of Gephi. + + DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + + Copyright 2011 Gephi Consortium. All rights reserved. + + The contents of this file are subject to the terms of either the GNU + General Public License Version 3 only ("GPL") or the Common + Development and Distribution License("CDDL") (collectively, the + "License"). You may not use this file except in compliance with the + License. You can obtain a copy of the License at + http://gephi.org/about/legal/license-notice/ + or /cddl-1.0.txt and /gpl-3.0.txt. See the License for the + specific language governing permissions and limitations under the + License. When distributing the software, include this License Header + Notice in each file and include the License files at + /cddl-1.0.txt and /gpl-3.0.txt. If applicable, add the following below the + License Header, with the fields enclosed by brackets [] replaced by + your own identifying information: + "Portions Copyrighted [year] [name of copyright owner]" + + If you wish your version of this file to be governed by only the CDDL + or only the GPL Version 3, indicate your decision by adding + "[Contributor] elects to include this software in this distribution + under the [CDDL or GPL Version 3] license." If you do not indicate a + single choice of license, a recipient has the option to distribute + your version of this file under either the CDDL, the GPL Version 3 or + to extend the choice of license to its licensees as provided above. + However, if you add GPL Version 3 code and therefore, elected the GPL + Version 3 license, then the option applies only if the new code is + made subject to such option by the copyright holder. + + Contributor(s): + + Portions Copyrighted 2011 Gephi Consortium. + */ +package org.gephi.filters; + +import java.beans.PropertyEditorManager; +import org.gephi.data.attributes.api.AttributeColumn; +import org.gephi.data.attributes.api.AttributeController; +import org.gephi.data.attributes.api.AttributeModel; +import org.gephi.data.attributes.api.AttributeOrigin; +import org.gephi.data.attributes.api.AttributeType; +import org.gephi.filters.api.FilterController; +import org.gephi.filters.api.FilterModel; +import org.gephi.filters.api.PropertyExecutor; +import org.gephi.filters.api.Query; +import org.gephi.filters.api.Range; +import org.gephi.filters.FilterThread.PropertyModifier; +import org.gephi.filters.spi.*; +import org.gephi.graph.api.Edge; +import org.gephi.graph.api.Graph; +import org.gephi.graph.api.GraphController; +import org.gephi.graph.api.GraphModel; +import org.gephi.graph.api.GraphView; +import org.gephi.graph.api.HierarchicalGraph; +import org.gephi.graph.api.Node; +import org.gephi.project.api.ProjectController; +import org.gephi.utils.progress.Progress; +import org.gephi.utils.progress.ProgressTicket; +import org.gephi.utils.progress.ProgressTicketProvider; +import org.gephi.project.api.Workspace; +import org.gephi.project.api.WorkspaceInformation; +import org.gephi.project.api.WorkspaceListener; +import org.gephi.visualization.api.VisualizationController; +import org.openide.util.Lookup; +import org.openide.util.lookup.ServiceProvider; +import org.openide.util.lookup.ServiceProviders; + +/** + * + * @author Mathieu Bastian + */ +@ServiceProviders({ + @ServiceProvider(service = FilterController.class), + @ServiceProvider(service = PropertyExecutor.class)}) +public class FilterControllerImpl implements FilterController, PropertyExecutor { + + private FilterModelImpl model; + + public FilterControllerImpl() { + //Register range editor + PropertyEditorManager.registerEditor(Range.class, RangePropertyEditor.class); + PropertyEditorManager.registerEditor(AttributeColumn.class, AttributeColumnPropertyEditor.class); + + //Model management + ProjectController pc = Lookup.getDefault().lookup(ProjectController.class); + pc.addWorkspaceListener(new WorkspaceListener() { + + public void initialize(Workspace workspace) { + workspace.add(new FilterModelImpl(workspace)); + } + + public void select(Workspace workspace) { + model = (FilterModelImpl) workspace.getLookup().lookup(FilterModel.class); + if (model == null) { + model = new FilterModelImpl(workspace); + workspace.add(model); + } + } + + public void unselect(Workspace workspace) { + } + + public void close(Workspace workspace) { + FilterModelImpl m = (FilterModelImpl) workspace.getLookup().lookup(FilterModel.class); + if (m != null) { + m.destroy(); + } + } + + public void disable() { + GraphModel graphModel = Lookup.getDefault().lookup(GraphController.class).getModel(); + if (model != null && model.getCurrentResult() != null && graphModel != null) { + graphModel.destroyView(model.getCurrentResult()); + model.setCurrentResult(null); + } + model = null; + } + }); + if (pc.getCurrentWorkspace() != null) { + Workspace workspace = pc.getCurrentWorkspace(); + model = (FilterModelImpl) workspace.getLookup().lookup(FilterModel.class); + if (model == null) { + model = new FilterModelImpl(workspace); + workspace.add(model); + } + } + } + + public Query createQuery(Filter filter) { + if (filter instanceof Operator) { + return new OperatorQueryImpl((Operator) filter); + } + return new FilterQueryImpl(filter); + } + + public void add(Query query) { + AbstractQueryImpl absQuery = ((AbstractQueryImpl) query); + absQuery = absQuery.getRoot(); + if (!model.hasQuery(absQuery)) { + model.addFirst(absQuery); + + //Init filters with default graph + Graph graph = null; + if (model != null && model.getGraphModel() != null) { + graph = model.getGraphModel().getGraph(); + } else { + GraphModel graphModel = Lookup.getDefault().lookup(GraphController.class).getModel(); + graph = graphModel.getGraph(); + } + + for (Query q : query.getDescendantsAndSelf()) { + Filter filter = q.getFilter(); + if (filter instanceof NodeFilter || filter instanceof EdgeFilter || filter instanceof AttributableFilter) { + FilterProcessor filterProcessor = new FilterProcessor(); + filterProcessor.init(filter, graph); + } + } + } + } + + public void remove(Query query) { + if (model.getCurrentQuery() == query) { + if (model.isSelecting()) { + selectVisible(null); + } else { + filterVisible(null); + } + } + query = ((AbstractQueryImpl) query).getRoot(); + model.remove(query); + } + + public void rename(Query query, String name) { + model.rename(query, name); + } + + public void setSubQuery(Query query, Query subQuery) { + //Init subquery when new filter + if (subQuery.getParent() == null && subQuery != model.getCurrentQuery()) { + Graph graph = null; + if (model != null && model.getGraphModel() != null) { + graph = model.getGraphModel().getGraph(); + } else { + GraphModel graphModel = Lookup.getDefault().lookup(GraphController.class).getModel(); + graph = graphModel.getGraph(); + } + Filter filter = subQuery.getFilter(); + if (filter instanceof NodeFilter || filter instanceof EdgeFilter || filter instanceof AttributableFilter) { + FilterProcessor filterProcessor = new FilterProcessor(); + filterProcessor.init(filter, graph); + } + } + + model.setSubQuery(query, subQuery); + } + + public void removeSubQuery(Query query, Query parent) { + model.removeSubQuery(query, parent); + } + + public void filterVisible(Query query) { + if (query != null && model.getCurrentQuery() == query && model.isFiltering()) { + return; + } + model.setFiltering(query != null); + model.setCurrentQuery(query); + + if (model.getFilterThread() != null) { + model.getFilterThread().setRunning(false); + model.setFilterThread(null); + } + if (query != null) { + FilterThread filterThread = new FilterThread(model); + model.setFilterThread(filterThread); + filterThread.setRootQuery((AbstractQueryImpl) query); + filterThread.start(); + } else { + model.getGraphModel().setVisibleView(null); + if (model.getCurrentResult() != null) { + model.getGraphModel().destroyView(model.getCurrentResult()); + model.setCurrentResult(null); + } + } + } + + public GraphView filter(Query query) { + FilterProcessor processor = new FilterProcessor(); + GraphModel graphModel = Lookup.getDefault().lookup(GraphController.class).getModel(); + Graph result = processor.process((AbstractQueryImpl) query, graphModel); + return result.getView(); + } + + public void selectVisible(Query query) { + if (query != null && model.getCurrentQuery() == query && model.isSelecting()) { + return; + } + model.setSelecting(query != null); + model.setCurrentQuery(query); + + if (model.getFilterThread() != null) { + model.getFilterThread().setRunning(false); + model.setFilterThread(null); + } + + model.getGraphModel().setVisibleView(null); + if (model.getCurrentResult() != null) { + model.getGraphModel().destroyView(model.getCurrentResult()); + model.setCurrentResult(null); + } + + if (query != null) { + FilterThread filterThread = new FilterThread(model); + model.setFilterThread(filterThread); + filterThread.setRootQuery((AbstractQueryImpl) query); + filterThread.start(); + } else { + VisualizationController visController = Lookup.getDefault().lookup(VisualizationController.class); + if (visController != null) { + visController.selectNodes(null); + } + } + } + + public void exportToColumn(String title, Query query) { + HierarchicalGraph result; + if (model.getCurrentQuery() == query) { + GraphView view = model.getCurrentResult(); + if (view == null) { + return; + } + result = model.getGraphModel().getHierarchicalGraph(view); + } else { + FilterProcessor processor = new FilterProcessor(); + GraphModel graphModel = Lookup.getDefault().lookup(GraphController.class).getModel(); + result = (HierarchicalGraph) processor.process((AbstractQueryImpl) query, graphModel); + } + AttributeModel am = Lookup.getDefault().lookup(AttributeController.class).getModel(); + AttributeColumn nodeCol = am.getNodeTable().getColumn("filter_" + title); + if (nodeCol == null) { + nodeCol = am.getNodeTable().addColumn("filter_" + title, title, AttributeType.BOOLEAN, AttributeOrigin.COMPUTED, Boolean.FALSE); + } + AttributeColumn edgeCol = am.getEdgeTable().getColumn("filter_" + title); + if (edgeCol == null) { + edgeCol = am.getEdgeTable().addColumn("filter_" + title, title, AttributeType.BOOLEAN, AttributeOrigin.COMPUTED, Boolean.FALSE); + } + result.readLock(); + for (Node n : result.getNodes()) { + n.getNodeData().getAttributes().setValue(nodeCol.getIndex(), Boolean.TRUE); + } + for (Edge e : result.getEdgesAndMetaEdges()) { + e.getEdgeData().getAttributes().setValue(edgeCol.getIndex(), Boolean.TRUE); + } + result.readUnlock(); + //StatusDisplayer.getDefault().setStatusText(NbBundle.getMessage(FilterControllerImpl.class, "FilterController.exportToColumn.status", title)); + } + + public void exportToNewWorkspace(Query query) { + HierarchicalGraph result; + if (model.getCurrentQuery() == query) { + GraphView view = model.getCurrentResult(); + if (view == null) { + return; + } + result = model.getGraphModel().getHierarchicalGraph(view); + } else { + FilterProcessor processor = new FilterProcessor(); + GraphModel graphModel = Lookup.getDefault().lookup(GraphController.class).getModel(); + result = (HierarchicalGraph) processor.process((AbstractQueryImpl) query, graphModel); + } + + final HierarchicalGraph graphView = result; + new Thread(new Runnable() { + + public void run() { + ProgressTicketProvider progressProvider = Lookup.getDefault().lookup(ProgressTicketProvider.class); + ProgressTicket ticket = null; + if (progressProvider != null) { + ticket = progressProvider.createTicket("Export to workspace", null); + } + Progress.start(ticket); + ProjectController pc = Lookup.getDefault().lookup(ProjectController.class); + Workspace newWorkspace = pc.duplicateWorkspace(pc.getCurrentWorkspace()); + GraphModel graphModel = Lookup.getDefault().lookup(GraphController.class).getModel(newWorkspace); + graphModel.clear(); + graphModel.pushFrom(graphView); + Progress.finish(ticket); + String workspaceName = newWorkspace.getLookup().lookup(WorkspaceInformation.class).getName(); + //StatusDisplayer.getDefault().setStatusText(NbBundle.getMessage(FilterControllerImpl.class, "FilterController.exportToNewWorkspace.status", workspaceName)); + } + }, "Export filter to workspace").start(); + } + + public void exportToLabelVisible(Query query) { + HierarchicalGraph result; + if (model.getCurrentQuery() == query) { + GraphView view = model.getCurrentResult(); + if (view == null) { + return; + } + result = model.getGraphModel().getHierarchicalGraph(view); + } else { + FilterProcessor processor = new FilterProcessor(); + result = (HierarchicalGraph) processor.process((AbstractQueryImpl) query, model.getGraphModel()); + } + HierarchicalGraph fullHGraph = model.getGraphModel().getHierarchicalGraph(); + fullHGraph.readLock(); + for (Node n : fullHGraph.getNodes()) { + boolean inView = n.getNodeData().getNode(result.getView().getViewId()) != null; + n.getNodeData().getTextData().setVisible(inView); + } + for (Edge e : fullHGraph.getEdgesAndMetaEdges()) { + boolean inView = result.contains(e); + e.getEdgeData().getTextData().setVisible(inView); + } + fullHGraph.readUnlock(); + } + + public void setAutoRefresh(boolean autoRefresh) { + if (model != null) { + model.setAutoRefresh(autoRefresh); + } + } + + public void setCurrentQuery(Query query) { + if (model != null) { + model.setCurrentQuery(query); + } + } + + public FilterModel getModel() { + return model; + } + + public synchronized FilterModel getModel(Workspace workspace) { + FilterModel filterModel = workspace.getLookup().lookup(FilterModel.class); + if (filterModel == null) { + filterModel = new FilterModelImpl(workspace); + workspace.add(filterModel); + } + return filterModel; + } + + public void setValue(FilterProperty property, Object value, Callback callback) { + if (model != null) { + Query query = model.getQuery(property.getFilter()); + if (query == null) { + callback.setValue(value); + return; + } + AbstractQueryImpl rootQuery = ((AbstractQueryImpl) query).getRoot(); + FilterThread filterThread = null; + if ((filterThread = model.getFilterThread()) != null && model.getCurrentQuery() == rootQuery) { + if (Thread.currentThread().equals(filterThread)) { + //Called inside of the thread, in init for instance. Update normally. + callback.setValue(value); + model.updateParameters(query); + } else { + //The query is currently being filtered by the thread, or finished to do it + filterThread.addModifier(new PropertyModifier(query, property, value, callback)); + filterThread.setRootQuery(rootQuery); + } + } else { + //Update normally + callback.setValue(value); + model.updateParameters(query); + } + } else { + callback.setValue(value); + } + } +} diff --git a/modules/FiltersPlugin/src/main/java/org/gephi/filters/plugin/operator/NOTBuilderNode.java b/modules/FiltersPlugin/src/main/java/org/gephi/filters/plugin/operator/NOTBuilderNode.java index caa0ead4a9892fff7b7f2bc4851ae3413cd41468..2c17cc576fb06c147633e4907a6ca78b7a974ab3 100644 --- a/modules/FiltersPlugin/src/main/java/org/gephi/filters/plugin/operator/NOTBuilderNode.java +++ b/modules/FiltersPlugin/src/main/java/org/gephi/filters/plugin/operator/NOTBuilderNode.java @@ -45,6 +45,7 @@ import java.util.ArrayList; import java.util.List; import javax.swing.Icon; import javax.swing.JPanel; +import org.gephi.filters.spi.AttributableFilter; import org.gephi.filters.spi.Category; import org.gephi.filters.spi.Filter; import org.gephi.filters.spi.FilterBuilder; @@ -157,6 +158,20 @@ public class NOTBuilderNode implements FilterBuilder { } nodeFilter.finish(); } + + if (filter instanceof AttributableFilter && ((AttributableFilter) filter).getType()==AttributableFilter.Type.NODE && ((AttributableFilter) filter).init(hgraph)) { + List nodeToRemove = new ArrayList(); + AttributableFilter attributableFilter = (AttributableFilter) filter; + for (Node n : hgraph.getNodes().toArray()) { + if (attributableFilter.evaluate(hgraph, n)) { + nodeToRemove.add(n); + } + } + for (Node n : nodeToRemove) { + hgraph.removeNode(n); + } + attributableFilter.finish(); + } return hgraph; } diff --git a/modules/ImportPlugin/src/main/java/org/gephi/io/importer/plugin/file/ImporterBuilderTGF.java b/modules/ImportPlugin/src/main/java/org/gephi/io/importer/plugin/file/ImporterBuilderTGF.java new file mode 100644 index 0000000000000000000000000000000000000000..2c5b4eb4be4d4d0e4c586093d4067481034574f8 --- /dev/null +++ b/modules/ImportPlugin/src/main/java/org/gephi/io/importer/plugin/file/ImporterBuilderTGF.java @@ -0,0 +1,76 @@ +/* +Copyright 2008-2010 Gephi +Authors : rlfnb +Website : http://www.gephi.org + +This file is part of Gephi. + +DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + +Copyright 2011 Gephi Consortium. All rights reserved. + +The contents of this file are subject to the terms of either the GNU +General Public License Version 3 only ("GPL") or the Common +Development and Distribution License("CDDL") (collectively, the +"License"). You may not use this file except in compliance with the +License. You can obtain a copy of the License at +http://gephi.org/about/legal/license-notice/ +or /cddl-1.0.txt and /gpl-3.0.txt. See the License for the +specific language governing permissions and limitations under the +License. When distributing the software, include this License Header +Notice in each file and include the License files at +/cddl-1.0.txt and /gpl-3.0.txt. If applicable, add the following below the +License Header, with the fields enclosed by brackets [] replaced by +your own identifying information: +"Portions Copyrighted [year] [name of copyright owner]" + +If you wish your version of this file to be governed by only the CDDL +or only the GPL Version 3, indicate your decision by adding +"[Contributor] elects to include this software in this distribution +under the [CDDL or GPL Version 3] license." If you do not indicate a +single choice of license, a recipient has the option to distribute +your version of this file under either the CDDL, the GPL Version 3 or +to extend the choice of license to its licensees as provided above. +However, if you add GPL Version 3 code and therefore, elected the GPL +Version 3 license, then the option applies only if the new code is +made subject to such option by the copyright holder. + +Contributor(s): + +Portions Copyrighted 2011 Gephi Consortium. +*/ +package org.gephi.io.importer.plugin.file; + +import org.gephi.io.importer.api.FileType; +import org.gephi.io.importer.spi.FileImporter; +import org.gephi.io.importer.spi.FileImporterBuilder; +import org.openide.filesystems.FileObject; +import org.openide.util.NbBundle; +import org.openide.util.lookup.ServiceProvider; + +/** + * + * @author rlfnb + */ +@ServiceProvider(service = FileImporterBuilder.class) +public final class ImporterBuilderTGF implements FileImporterBuilder { + + public static final String IDENTIFER = "tgf"; + + public FileImporter buildImporter() { + return new ImporterTGF(); + } + + public String getName() { + return IDENTIFER; + } + + public FileType[] getFileTypes() { + FileType ft = new FileType(".tgf", NbBundle.getMessage(getClass(), "fileType_TGF_Name")); + return new FileType[]{ft}; + } + + public boolean isMatchingImporter(FileObject fileObject) { + return fileObject.getExt().equalsIgnoreCase("tgf"); + } +} diff --git a/modules/ImportPlugin/src/main/java/org/gephi/io/importer/plugin/file/ImporterTGF.java b/modules/ImportPlugin/src/main/java/org/gephi/io/importer/plugin/file/ImporterTGF.java new file mode 100644 index 0000000000000000000000000000000000000000..dffb4cd29aff5bed3b3122379629b2872066d873 --- /dev/null +++ b/modules/ImportPlugin/src/main/java/org/gephi/io/importer/plugin/file/ImporterTGF.java @@ -0,0 +1,183 @@ +/* + Copyright 2008-2010 Gephi + Authors : rlfnb + Website : http://www.gephi.org + + This file is part of Gephi. + + DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + + Copyright 2011 Gephi Consortium. All rights reserved. + + The contents of this file are subject to the terms of either the GNU + General Public License Version 3 only ("GPL") or the Common + Development and Distribution License("CDDL") (collectively, the + "License"). You may not use this file except in compliance with the + License. You can obtain a copy of the License at + http://gephi.org/about/legal/license-notice/ + or /cddl-1.0.txt and /gpl-3.0.txt. See the License for the + specific language governing permissions and limitations under the + License. When distributing the software, include this License Header + Notice in each file and include the License files at + /cddl-1.0.txt and /gpl-3.0.txt. If applicable, add the following below the + License Header, with the fields enclosed by brackets [] replaced by + your own identifying information: + "Portions Copyrighted [year] [name of copyright owner]" + + If you wish your version of this file to be governed by only the CDDL + or only the GPL Version 3, indicate your decision by adding + "[Contributor] elects to include this software in this distribution + under the [CDDL or GPL Version 3] license." If you do not indicate a + single choice of license, a recipient has the option to distribute + your version of this file under either the CDDL, the GPL Version 3 or + to extend the choice of license to its licensees as provided above. + However, if you add GPL Version 3 code and therefore, elected the GPL + Version 3 license, then the option applies only if the new code is + made subject to such option by the copyright holder. + + Contributor(s): + + Portions Copyrighted 2011 Gephi Consortium. + */ +package org.gephi.io.importer.plugin.file; + +import java.io.LineNumberReader; +import java.io.Reader; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.gephi.io.importer.api.ContainerLoader; +import org.gephi.io.importer.api.EdgeDraft; +import org.gephi.io.importer.api.ImportUtils; +import org.gephi.io.importer.api.NodeDraft; +import org.gephi.io.importer.api.Report; +import org.gephi.io.importer.spi.FileImporter; +import org.gephi.utils.longtask.spi.LongTask; +import org.gephi.utils.progress.Progress; +import org.gephi.utils.progress.ProgressTicket; + +/** + * + * @author rlfnb + */ +public class ImporterTGF implements FileImporter, LongTask { + + //Architecture + private Reader reader; + private ContainerLoader container; + private Report report; + private ProgressTicket progressTicket; + private boolean cancel = false; + + public boolean execute(ContainerLoader container) { + this.container = container; + this.report = new Report(); + LineNumberReader lineReader = ImportUtils.getTextReader(reader); + try { + importData(lineReader); + } catch (Exception e) { + throw new RuntimeException(e); + } + return !cancel; + } + + private void importData(LineNumberReader reader) throws Exception { + Progress.start(progressTicket); //Progress + + List nodes = new ArrayList(); + List edges = new ArrayList(); + boolean isNode = true; + for (; reader.ready();) { + String line = reader.readLine().trim(); + if ("#".equalsIgnoreCase(line)) { + isNode = false; + } else { + if (line != null && !line.isEmpty()) { + if (isNode) { + nodes.add(line); + } else { + edges.add(line); + } + } + } + } + + Progress.switchToDeterminate(progressTicket, nodes.size() + edges.size()); + + if (nodes.isEmpty()) { + throw new Exception("Cannot import a graph without nodes!"); + } + for (String n : nodes) { + addNode(n.substring(0, n.indexOf(" ")), n.substring(n.indexOf(" "))); + } + Progress.progress(progressTicket); //Progress + for (String e : edges) { + int firstSpace = e.indexOf(" "); + int secondSpace = e.indexOf(" ", firstSpace+1); + String[] tempFields = e.split(" "); + String from = tempFields[0]; + String to = tempFields[1]; + addEdge(from, to, e.substring(secondSpace)); + } + Progress.progress(progressTicket); //Progress + } + + private void addNode(String id, String label) { + NodeDraft node; + if (!container.nodeExists(id)) { + node = container.factory().newNodeDraft(); + node.setId(id); + node.setLabel(label); + container.addNode(node); + } + } + + private void addEdge(String source, String target, String label) { + NodeDraft sourceNode; + if (!container.nodeExists(source)) { + sourceNode = container.factory().newNodeDraft(); + sourceNode.setId(source); + container.addNode(sourceNode); + } else { + sourceNode = container.getNode(source); + } + NodeDraft targetNode; + if (!container.nodeExists(target)) { + targetNode = container.factory().newNodeDraft(); + targetNode.setId(target); + container.addNode(targetNode); + } else { + targetNode = container.getNode(target); + } + EdgeDraft edge = container.getEdge(sourceNode, targetNode); + if (edge == null) { + edge = container.factory().newEdgeDraft(); + edge.setSource(sourceNode); + edge.setTarget(targetNode); + edge.setLabel(label); + container.addEdge(edge); + } + } + + public void setReader(Reader reader) { + this.reader = reader; + } + + public ContainerLoader getContainer() { + return container; + } + + public Report getReport() { + return report; + } + + public boolean cancel() { + cancel = true; + return true; + } + + public void setProgressTicket(ProgressTicket progressTicket) { + this.progressTicket = progressTicket; + } +} diff --git a/modules/ImportPlugin/src/main/resources/org/gephi/io/importer/plugin/file/Bundle.properties b/modules/ImportPlugin/src/main/resources/org/gephi/io/importer/plugin/file/Bundle.properties index 0efcdc41b08a469399e0677c3e0d0528f56b5ee2..a52e1f846be17386426d5c1c7f8a564ef6117c65 100644 --- a/modules/ImportPlugin/src/main/resources/org/gephi/io/importer/plugin/file/Bundle.properties +++ b/modules/ImportPlugin/src/main/resources/org/gephi/io/importer/plugin/file/Bundle.properties @@ -5,6 +5,7 @@ fileType_GraphML_Name = GraphML Files fileType_GML_Name = GML Files fileType_TLP_Name = TLP Files fileType_CSV_Name = CSV Files +fileType_TGF_Name = TGF Files fileType_Edges_Name = Edge List fileType_GraphViz_Name = GraphViz Files fileType_DL_Name = DL Files (UCINET) @@ -125,4 +126,4 @@ importerDOT_error_labelunreachable = Unable to find label at line {0} importerDOT_error_colorunreachable = Unable to find color at line {0} importerDOT_error_edgeparsing = Unable to parse edge at line {0} importerDOT_error_posunreachable = Unable to parse position of node at line {0}. Must be pos="x, y". -importerDOT_error_weightunreachable = Unable to parse edge's weight at line {0} \ No newline at end of file +importerDOT_error_weightunreachable = Unable to parse edge's weight at line {0} diff --git a/modules/VisualizationImpl/src/main/java/org/gephi/visualization/component/ActionsToolbar.java b/modules/VisualizationImpl/src/main/java/org/gephi/visualization/component/ActionsToolbar.java index d19d90a73149e3ef4c9a1e62710a1cacbec58708..98ec98cfce391e9249949ac765e60420b60fbd76 100644 --- a/modules/VisualizationImpl/src/main/java/org/gephi/visualization/component/ActionsToolbar.java +++ b/modules/VisualizationImpl/src/main/java/org/gephi/visualization/component/ActionsToolbar.java @@ -71,7 +71,7 @@ public class ActionsToolbar extends JToolBar { //Settings private Color color = new Color(0.6f, 0.6f, 0.6f); - private float size = 1f; + private float size = 10.0f; public ActionsToolbar() { initDesign();