/*
* This file is part of NavTable
* Copyright (C) 2009 - 2010 Cartolab (Universidade da Coru�a)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*
* Authors:
* Juan Ignacio Varela Garc�a <nachouve (at) gmail (dot) com>
* Pablo Sanxiao Roca <psanxiao (at) gmail (dot) com>
* Javier Est�vez Vali�as <valdaris (at) gmail (dot) com>
* Francisco Puga Alonso <fpuga (at) cartolab (dot) com>
* Jorge Lopez Fernandez <jlopez (at) cartolab (dot) es>
*/
package es.udc.cartolab.gvsig.navtable;
import java.io.File;
import java.util.ArrayList;
import org.apache.log4j.Logger;
import com.hardcode.gdbms.driver.exceptions.ReadDriverException;
import com.iver.andami.PluginServices;
import com.iver.andami.plugins.Extension;
import com.iver.andami.preferences.IPreference;
import com.iver.andami.preferences.IPreferenceExtension;
import com.iver.andami.ui.mdiManager.IWindow;
import com.iver.cit.gvsig.About;
import com.iver.cit.gvsig.fmap.edition.IEditableSource;
import com.iver.cit.gvsig.fmap.layers.FLayer;
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
import com.iver.cit.gvsig.fmap.layers.layerOperations.AlphanumericData;
import com.iver.cit.gvsig.gui.panels.FPanelAbout;
import com.iver.cit.gvsig.project.documents.table.gui.Table;
import com.iver.cit.gvsig.project.documents.view.gui.BaseView;
import com.iver.utiles.extensionPoints.ExtensionPoints;
import com.iver.utiles.extensionPoints.ExtensionPointsSingleton;
import es.udc.cartolab.gvsig.navtable.contextualmenu.FiltersAddon;
import es.udc.cartolab.gvsig.navtable.contextualmenu.INavTableContextMenu;
import es.udc.cartolab.gvsig.navtable.contextualmenu.SorterAddon;
import es.udc.cartolab.gvsig.navtable.preferences.NavTablePreferencesPage;
import es.udc.cartolab.gvsig.navtable.preferences.Preferences;
import es.udc.cartolab.gvsig.navtable.utils.NavTableTocMenuEntry;
public class NavTableExtension extends Extension implements IPreferenceExtension {
private IPreference[] preferencesPage;
protected static Logger logger = Logger.getLogger("NavTable");
public void execute(String actionCommand) {
if (enableNavtable()) {
openNavtable();
} else if (enableAlphanumericNavtable()) {
openAlphanumericNavtable();
}
}
private void openNavtable() {
IWindow iWindow = PluginServices.getMDIManager().getActiveWindow();
if(iWindow instanceof BaseView){
for (FLyrVect vectorialLyr : getActiveVectorialLayersOnTheActiveWindow()) {
NavTable navtable = new NavTable(vectorialLyr);
if (navtable.init()) {
PluginServices.getMDIManager().addCentredWindow(navtable);
}
}
} else if(isActiveWindowAttTableFromLayer()){
AlphanumericData data = ((Table) iWindow).getModel().getAssociatedTable();
if(data instanceof FLyrVect){
NavTable nt = new NavTable((FLyrVect) data);
if(nt.init()){
PluginServices.getMDIManager().addCentredWindow(nt);
}
}
}
}
private void openAlphanumericNavtable() {
Table table = (Table) PluginServices.getMDIManager().getActiveWindow();
IEditableSource model = table.getModel().getModelo();
AlphanumericNavTable viewer;
try {
viewer = new AlphanumericNavTable(model, table.getModel().getName());
if (viewer.init()) {
PluginServices.getMDIManager().addCentredWindow(viewer);
}
} catch (ReadDriverException e) {
logger.error(e.getMessage(), e);
}
}
public void initialize() {
About about = (About) PluginServices.getExtension(About.class);
FPanelAbout panelAbout = about.getAboutPanel();
java.net.URL aboutURL = this.getClass().getResource("/about.htm");
panelAbout.addAboutUrl("NavTable", aboutURL);
// Entry at TOC contextual menu
ExtensionPoints extensionPoints = ExtensionPointsSingleton
.getInstance();
extensionPoints.add("View_TocActions", "NavTable",
new NavTableTocMenuEntry());
// Add NavTable "official" context menu addons to the extension point
INavTableContextMenu filtersAddon = new FiltersAddon();
extensionPoints.add(AbstractNavTable.NAVTABLE_CONTEXT_MENU,
filtersAddon.getName(), filtersAddon);
INavTableContextMenu sorterAddon = new SorterAddon();
extensionPoints.add(AbstractNavTable.NAVTABLE_CONTEXT_MENU,
sorterAddon.getName(), sorterAddon);
// Creating config Dir
File configDir;
String configDirStr;
try {
configDirStr = com.iver.andami.Launcher.getAppHomeDir()
+ "NavTable";
} catch (java.lang.NoSuchMethodError e) {
configDirStr = System.getProperty("user.home") + File.separator
+ "gvSIG" + File.separator + "navTable";
}
configDir = new File(configDirStr);
Preferences p = new Preferences(configDir);
}
public boolean isVisible() {
return true;
}
public boolean isEnabled() {
return enableNavtable() || enableAlphanumericNavtable();
}
protected boolean enableNavtable() {
return !getActiveVectorialLayersOnTheActiveWindow().isEmpty() || isActiveWindowAttTableFromLayer();
}
protected boolean enableAlphanumericNavtable() {
IWindow iWindow = PluginServices.getMDIManager().getActiveWindow();
if ((iWindow != null) && (iWindow.getClass() == Table.class)
&& !(isActiveWindowAttTableFromLayer())) {
return true;
}
return false;
}
private boolean isActiveWindowAttTableFromLayer() {
IWindow w = PluginServices.getMDIManager().getActiveWindow();
if(!(w instanceof Table)){
return false;
}
return ((Table) w).getModel().getAssociatedTable() instanceof FLyrVect;
}
private ArrayList<FLyrVect> getActiveVectorialLayersOnTheActiveWindow() {
IWindow iWindow = PluginServices.getMDIManager().getActiveWindow();
ArrayList<FLyrVect> activeVectorialLayers = new ArrayList<FLyrVect>();
if (iWindow instanceof BaseView) {
FLayer[] activeLayers = ((BaseView) iWindow).getMapControl()
.getMapContext().getLayers().getActives();
for (FLayer lyr : activeLayers) {
if (lyr instanceof FLyrVect) {
activeVectorialLayers.add((FLyrVect) lyr);
}
}
}
return activeVectorialLayers;
}
public IPreference[] getPreferencesPages() {
if (preferencesPage == null) {
preferencesPage = new IPreference[] { new NavTablePreferencesPage() };
}
return preferencesPage;
}
}