001 package nl.cwi.sen1.visplugin; 002 003 import java.awt.event.ActionEvent; 004 005 import javax.swing.AbstractAction; 006 import javax.swing.JMenu; 007 import javax.swing.JMenuItem; 008 import javax.swing.JOptionPane; 009 import javax.swing.JPanel; 010 011 import nl.cwi.sen1.gui.Studio; 012 import nl.cwi.sen1.gui.StudioImplWithPredefinedLayout; 013 import nl.cwi.sen1.gui.StudioWithPredefinedLayout; 014 import nl.cwi.sen1.gui.component.StudioComponent; 015 import nl.cwi.sen1.gui.component.StudioComponentImpl; 016 import nl.cwi.sen1.relationstores.Factory; 017 import nl.cwi.sen1.relationstores.types.Location; 018 import nl.cwi.sen1.relationstores.types.RTuple; 019 import nl.cwi.sen1.visplugin.screenshotmaker.ScreenshotMaker; 020 021 /** 022 * The VisualizationPluginWindow class represents the base class for the 023 * different plugin windows. 024 * 025 * @author Aldert Boerhoop 026 * @date 20-2-2007 027 */ 028 public abstract class VisualizationPluginWindow { 029 030 protected Factory m_factory; 031 032 private Studio m_studio; 033 private int m_storeId; 034 private int m_factId; 035 private RTuple m_fact; 036 private String m_title; 037 private VisualizationPluginController m_controller; 038 private int m_windowId; 039 private ContainerPanel m_containerPanel=null; 040 041 042 /** 043 * Default constructor 044 * 045 * @author Aldert Boerhoop 046 * @date 20-2-2007 047 */ 048 public VisualizationPluginWindow() { 049 } 050 051 /** 052 * Initialize the window properties 053 * 054 * @author Aldert Boerhoop 055 * @date 20-2-2007 056 * @param Studio studio, int storeId, int factId, RTuple fact 057 */ 058 public final void initializeWindow(Studio studio, int storeId, int factId, 059 RTuple fact, Factory factory, String pluginName, 060 VisualizationPluginController controller, int windowId) { 061 m_studio = studio; 062 m_storeId = storeId; 063 m_factId = factId; 064 m_fact = fact; 065 m_factory = factory; 066 m_title = fact.getVariable().getString(); 067 m_controller = controller; 068 m_windowId = windowId; 069 } 070 071 /** 072 * Returns the studio of the visualization plugin window. 073 * 074 * @return The studio object. 075 * 076 * @author Arend van Beelen 077 * @date 13-3-2007 078 */ 079 public Studio getStudio() { 080 return m_studio; 081 } 082 083 /** 084 * method is called on load of the window overridable 085 * 086 * @author Aldert Boerhoop 087 * @date 16-3-2007 088 * @param the filename to store the export in 089 */ 090 public void executeOnLoad() { 091 092 } 093 094 095 /** 096 * Returns the controller of the visualization plugin window. 097 * 098 * @return The controller object. 099 * @author Arend van Beelen 100 * @date 13-3-2007 101 */ 102 public VisualizationPluginController getController() { 103 return m_controller; 104 } 105 106 /** 107 * Returns the window ID of the visualization plugin window. 108 * 109 * @return The window ID. 110 * @author Arend van Beelen 111 * @date 13-3-2007 112 */ 113 public int getWindowId() { 114 return m_windowId; 115 } 116 117 /** 118 * Display the plugin window 119 * 120 * @author Aldert Boerhoop 121 * @date 20-2-2007 122 */ 123 public final void displayVisualization() { 124 // create a content panel on the right with menu bar 125 JPanel contentPanel = render(m_fact); 126 JMenu extensionMenu = createExtensionMenu(); 127 128 connectPanelWithMenu(extensionMenu, contentPanel, m_title, 129 StudioImplWithPredefinedLayout.TOP_RIGHT); 130 } 131 132 /** 133 * Create a menu 134 * 135 * @author Arjen van Schie & Michel Rijnders 136 * @date 20-2-2007 137 * @return The JMenu 138 */ 139 protected JMenu createExtensionMenu() { 140 // create the menu item 141 JMenu extensionMenu = new JMenu("Visualization"); 142 143 // create the sub-item Export 144 JMenuItem export = new JMenuItem("Export to image"); 145 export.addActionListener(new AbstractAction() { 146 public void actionPerformed(ActionEvent e) { 147 m_controller.exportToClicked( 148 VisualizationPluginController.requestType.image, 149 m_windowId); 150 } 151 152 private final static long serialVersionUID = 1; 153 }); 154 extensionMenu.add(export); 155 156 return extensionMenu; 157 } 158 159 160 /** 161 * calls the exportToClicked method on the controller 162 * 163 * @author Aldert Boerhoop 164 * @date 16-3-2007 165 */ 166 public final void exportToCsvClicked(){ 167 168 m_controller.exportToClicked(VisualizationPluginController.requestType.csv, m_windowId); 169 } 170 171 /** 172 * method is called from the toolbus 173 * 174 * @author Aldert Boerhoop 175 * @date 16-3-2007 176 * @param the filename to store the export in 177 */ 178 protected void exportToCsv(String fileName){} 179 180 /** 181 * Show a popup 182 * 183 * @author Arjen van Schie & Michel Rijnders 184 * @date 20-2-2007 185 * @param Message 186 * to display 187 */ 188 public final void showPopUp(String msg) { 189 JOptionPane.showMessageDialog(m_containerPanel, msg); 190 } 191 192 /** 193 * connects a given JPanel and JMenu to the meta-environment 194 * 195 * @author Arjen van Schie & Michel Rijnders 196 * @date 20-2-2007 197 * @param JMenu menu,JPanel contentPanel,String title,String orientation 198 */ 199 private final void connectPanelWithMenu(JMenu menu, JPanel contentPanel, 200 String title, String orientation) { 201 if (contentPanel != null) { 202 // generate a container panel ( this is a panel with a 203 // hidden warningpanel and the given content panel) 204 m_containerPanel = new ContainerPanel(contentPanel); 205 206 // generate the meta-studio component from the default 207 // implementation 208 StudioComponent component = new StudioComponentImpl(title, m_containerPanel); 209 210 VisualizationWindowListener tempListener = new VisualizationWindowListener(this, component); 211 component.addStudioComponentListener(tempListener); 212 213 // add the component to the studio 214 ((StudioWithPredefinedLayout) m_studio).addComponent(component, 215 orientation); 216 217 // add the menu (if there is any) 218 if (menu != null) { 219 m_studio.addComponentMenu(component, menu); 220 } 221 } 222 } 223 224 /** 225 * Removes a component from the Meta-Environment so it is removed from the 226 * views menu as well. 227 * 228 * @param component The component to remove. 229 * 230 * @author Arend van Beelen 231 * @author Anton Gerdesse 232 * @date 19-03-2007 233 */ 234 public void disconnectComponent(StudioComponent component) { 235 m_studio.removeComponent(component); 236 } 237 238 /** 239 * Show out of date message 240 * 241 * @author Aldert Boerhoop 242 * @author Arjen van Schie 243 * @date 20-2-2007 244 */ 245 public final void factOutOfDate() { 246 m_containerPanel.showRstoreChangedWarning(); 247 } 248 249 /** 250 * The rstore of this fact has been unloaded. 251 * 252 * @author Bas Basten 253 * @author Anton Lycklama a Nijeholt 254 * @author Arjen van Schie 255 * @date 14-03-2007 256 */ 257 public final void rstoreUnloaded() { 258 m_containerPanel.showRstoreUnloadedWarning(); 259 } 260 261 /** 262 * get the Store id 263 * 264 * @author Aldert Boerhoop 265 * @date 20-2-2007 266 * @return The Store id 267 */ 268 public final int getStoreId() { 269 return m_storeId; 270 } 271 272 /** 273 * get the Fact id 274 * 275 * @author Aldert Boerhoop 276 * @date 20-2-2007 277 * @return The Fact id 278 */ 279 public final int getFactId() { 280 return m_factId; 281 } 282 283 /** 284 * Render the plugin window 285 * 286 * @author Aldert Boerhoop 287 * @date 20-2-2007 288 * @param Fact 289 * to display 290 * @return The JPanel 291 */ 292 public abstract JPanel render(RTuple fact); 293 294 /** 295 * Functionality that's triggered by the export menu 296 * 297 * @author Aldert Boerhoop 298 * @date 9-3-2007 299 */ 300 public void exportToImage(String fileName) { 301 ScreenshotMaker.saveScreenshot(m_containerPanel.getContentPanel(), fileName, 302 ScreenshotMaker.DEFAULT_EXTENSION); 303 } 304 305 public void openLocationInEditor(Location loc) { 306 m_controller.openLocationInEditor(loc); 307 } 308 }