Revision 24260 trunk/extensions/dockingSkin/src/main/java/org/gvsig/mdiManager/DockingManager.java

View differences:

DockingManager.java
1 1
package org.gvsig.mdiManager;
2 2

  
3 3
import java.awt.BorderLayout;
4
import java.awt.Component;
5 4
import java.awt.Container;
6 5
import java.awt.Dimension;
6
import java.awt.event.ActionEvent;
7
import java.awt.event.ActionListener;
8
import java.awt.event.WindowAdapter;
9
import java.awt.event.WindowEvent;
7 10
import java.beans.PropertyVetoException;
8
import java.util.HashMap;
11
import java.util.ArrayList;
12
import java.util.Iterator;
9 13

  
10 14
import javax.swing.ImageIcon;
11 15
import javax.swing.JDialog;
16
import javax.swing.JInternalFrame;
17
import javax.swing.JLabel;
12 18

  
13 19
import net.infonode.docking.RootWindow;
20
import net.infonode.docking.SplitWindow;
21
import net.infonode.docking.TabWindow;
14 22
import net.infonode.docking.View;
23
import net.infonode.docking.properties.RootWindowProperties;
24
import net.infonode.docking.util.DeveloperUtil;
15 25
import net.infonode.docking.util.DockingUtil;
26
import net.infonode.docking.util.PropertiesUtil;
27
import net.infonode.docking.util.StringViewMap;
28
import net.infonode.docking.util.ViewMap;
29
import net.infonode.util.Direction;
16 30

  
31
import org.apache.log4j.Logger;
32

  
17 33
import com.iver.andami.plugins.Extension;
18 34
import com.iver.andami.ui.mdiFrame.MDIFrame;
19 35
import com.iver.andami.ui.mdiManager.IWindow;
36
import com.iver.andami.ui.mdiManager.IWindowListener;
20 37
import com.iver.andami.ui.mdiManager.MDIManager;
21 38
import com.iver.andami.ui.mdiManager.SingletonDialogAlreadyShownException;
39
import com.iver.andami.ui.mdiManager.SingletonWindow;
22 40
import com.iver.andami.ui.mdiManager.WindowInfo;
23 41

  
24 42
public class DockingManager extends Extension implements MDIManager {
25
	private RootWindow contentPanel;
26 43
	private MDIFrame mainFrame;
27
	private HashMap<Object, IWindow> windowRelationship;
28
	private HashMap<IWindow, Object> invertedWindowRelationship;
29
	private HashMap<IWindow,WindowInfo> infoRelationship;
44
	// private HashMap<Object, IWindow> windowRelationship;
45
	// private HashMap<IWindow, Object> invertedWindowRelationship;
46
	// private HashMap<IWindow, WindowInfo> infoRelationship;
47
	private static Logger logger = Logger.getLogger(DockingManager.class
48
			.getName());
30 49

  
50
	public static final int PROJECT_MANAGER = 0;
51
	public static final int VIEWS = 1;
52
	public static final int TOOLS = 2;
53

  
54
	private View[] windowingLayout = new View[3];
55
	private ViewMap viewMap = new ViewMap();
56
	private TabWindow tabProject;
57
	private TabWindow tabViews;
58
	private TabWindow tabTools;
59
	private TabWindow tabRootWindow;
60
	private RootWindow rootWindow;
61

  
62
	private DialogStack dialogStack;
63

  
64
	private SingletonSupport singletonSupport;
65
	private DockWindowStack windowStack;
66
	private DockWindowSupport dockWindowSupport;
67
	private DockWindowStack wss;
68
	private DockInfoSupport wis;
69

  
70
	/**
71
	 * Associates JInternalFrames with the IWindow they contain
72
	 */
31 73
	public void init(MDIFrame frame) {
74

  
75
		dockWindowSupport = new DockWindowSupport(mainFrame, rootWindow);
76
		dialogStack = new DialogStack();
77
		singletonSupport = new SingletonSupport();
78
		wis = new DockInfoSupport(mainFrame, dockWindowSupport,
79
				singletonSupport);
80
		wss = new DockWindowStack(wis);
81
		dockWindowSupport.setVis(wis);
82

  
83
		initDockingSystem();
84

  
32 85
		// TODO Auto-generated method stub
33 86
		mainFrame = frame;
34
		contentPanel = new RootWindow(null);
35
		windowRelationship = new HashMap<Object, IWindow>();
36
		invertedWindowRelationship = new HashMap<IWindow, Object>();
37
		infoRelationship = new HashMap<IWindow, WindowInfo>();
38
		mainFrame.getContentPane().add(contentPanel, BorderLayout.CENTER);
39
		
87

  
88
		// contentPanel.getWindowBar(Direction.LEFT).setEnabled(true);
89
		// contentPanel.getWindowBar(Direction.DOWN).setEnabled(true);
90
		// contentPanel.getWindowBar(Direction.RIGHT).setEnabled(true);
91
		// contentPanel.setWindow(new SplitWindow(true, 0.4f, new SplitWindow(
92
		// false, views[0], new SplitWindow(false, views[1], views[2])),
93
		// new TabWindow(new DockingWindow[] { views[3], views[4] })));
94

  
95
		// contentPanel.setWindow(new SplitWindow(true, 0.35f,
96
		// windowingLayout[PROJECT_MANAGER],
97
		// new SplitWindow(false,0.7f,
98
		// windowingLayout[VIEWS],
99
		// windowingLayout[TOOLS])));
100
		// DeveloperUtil.createWindowLayoutFrame("Debug Layout Window",
101
		// contentPanel)
102
		// .setVisible(true);
103

  
104
		// windowRelationship = new HashMap<Object, IWindow>();
105
		// invertedWindowRelationship = new HashMap<IWindow, Object>();
106
		// infoRelationship = new HashMap<IWindow, WindowInfo>();
107
		mainFrame.getContentPane().add(rootWindow, BorderLayout.CENTER);
108
		// contentPanel.split(dockingwindow, direccion, ni guarra)
40 109
	}
41 110

  
111
	private void initDockingSystem() {
112
		// TODO Auto-generated method stub
113

  
114
		// Creating view map
115
		View[] views = new View[20];
116
		ViewMap viewMap = new ViewMap();
117
		for (int i = 0; i < views.length; i++) {
118
			views[i] = new View("View " + i, null, new JLabel("This is view "
119
					+ i + "!"));
120
			viewMap.addView(i, views[i]);
121

  
122
		}
123
		// Creating views tab window
124
		tabProject = new TabWindow();
125
		// Adding views to the tab
126
		// tabProject.addTab(views[0]);
127
		// tabProject.addTab(views[1]);
128
		// tabProject.addTab(views[2]);
129
		tabProject.setPreferredMinimizeDirection(Direction.LEFT);
130

  
131
		// Creating views tab window
132
		tabViews = new TabWindow();
133
		// Adding views to the tab
134
		// tabViews.addTab(views[3]);
135
		// tabViews.addTab(views[4]);
136
		// tabViews.addTab(views[5]);
137
		tabViews.setPreferredMinimizeDirection(Direction.RIGHT);
138

  
139
		// Creating views tab window
140
		tabTools = new TabWindow();
141
		// Adding views to the tab
142
		// tabTools.addTab(views[6]);
143
		// tabTools.addTab(views[7]);
144
		// tabTools.addTab(views[8]);
145
		tabTools.setPreferredMinimizeDirection(Direction.DOWN);
146

  
147
		// Creating the main tab window
148
		tabRootWindow = new TabWindow();
149
		// Creating the split window
150
		SplitWindow splitRootWindow = new SplitWindow(true, 0.35f, tabProject,
151
				new SplitWindow(false, 0.7f, tabViews, tabTools));
152
		// Adding the split to the tab
153
		tabRootWindow.addTab(splitRootWindow);
154

  
155
		// Creating the root window
156
		rootWindow = DockingUtil.createRootWindow(new StringViewMap(), true);
157

  
158
		// Setting up the root window
159
		rootWindow.getWindowBar(Direction.LEFT).setEnabled(true);
160
		rootWindow.getWindowBar(Direction.DOWN).setEnabled(true);
161
		rootWindow.getWindowBar(Direction.RIGHT).setEnabled(true);
162

  
163
		// Setting the tab window inside root window
164
		// rootWindow.setWindow(tabRootWindow);
165
		// Creating style bar title
166
		RootWindowProperties titleBarStyleProperties = PropertiesUtil
167
				.createTitleBarStyleRootWindowProperties();
168
		// titleBarStyleProperties.getDockingWindowProperties().setDockEnabled(
169
		// false);
170
		//titleBarStyleProperties.getDockingWindowProperties().setUndockEnabled(
171
		// false);
172
		// titleBarStyleProperties.setRecursiveTabsEnabled(true);
173

  
174
		// Setting the style to the root window
175
		rootWindow.getRootWindowProperties().addSuperObject(
176
				titleBarStyleProperties);
177

  
178
		// Only for test
179
		DeveloperUtil
180
				.createWindowLayoutFrame("Debug Layout Window", rootWindow)
181
				.setVisible(true);
182

  
183
	}
184

  
42 185
	public IWindow addWindow(IWindow iWindow)
43
	throws SingletonDialogAlreadyShownException {
186
			throws SingletonDialogAlreadyShownException {
187
		// se obtiene la informaci?n de la vista
44 188
		WindowInfo wi = iWindow.getWindowInfo();
45
		Object newWindow;
46
		if (wi.isModal()) {
47
			newWindow = addModalDialog(iWindow, wi);
189
		// New window object
190
		Object newWindow = null;
191

  
192
		if ((iWindow instanceof SingletonWindow) && (wi.isModal())) {
193
			throw new RuntimeException("A modal view cannot be a SingletonView");
48 194
		}
49
		else {
50
			newWindow = addDockedWindow(iWindow, wi);
195

  
196
		/*
197
		 * Se obtiene la referencia a la vista anterior por si es una singleton
198
		 * y est? siendo mostrada. Se obtiene su informaci?n si ya fue mostrada
199
		 */
200
		boolean singletonPreviouslyAdded = false;
201

  
202
		if (iWindow instanceof SingletonWindow) {
203
			SingletonWindow sw = (SingletonWindow) iWindow;
204
			singletonPreviouslyAdded = singletonSupport.registerWindow(sw
205
					.getClass(), sw.getWindowModel(), wi);
51 206
		}
52
		
53
		windowRelationship.put(newWindow, iWindow);
54
		invertedWindowRelationship.put(iWindow, newWindow);
55
		infoRelationship.put(iWindow, wi);
207

  
208
		if (singletonPreviouslyAdded) {
209
			System.out.println("ventana tipo singleton");
210
			if (!singletonSupport.contains((SingletonWindow) iWindow)) {
211
				// restaurar el foco;
212
				DockWindow frame = dockWindowSupport.getDockWindow(iWindow);
213
				singletonSupport.openSingletonWindow((SingletonWindow) iWindow,
214
						frame);
215
				addDockedWindow(iWindow, wi);
216
				wss.add(iWindow, new ActionListener() {
217
					public void actionPerformed(ActionEvent e) {
218
						IWindow v = wis.getWindowById(Integer.parseInt(e
219
								.getActionCommand()));
220
						DockWindow f = dockWindowSupport.getDockWindow(v);
221
						f.restoreFocus();
222
						// activateJInternalFrame(f);
223
					}
224
				});
225
				return iWindow;
226
			} else {
227
				// restaurar el foco
228
				// La vista est? actualmente abierta
229
				DockWindow frame = (DockWindow) singletonSupport
230
						.getFrame((SingletonWindow) iWindow);
231
				// activateJInternalFrame(frame);
232
				frame.restoreFocus();
233
				wss.setActive(iWindow);
234
				return dockWindowSupport.getWindow((DockWindow) frame);
235
			}
236

  
237
		} else {
238
			// infoRelationship.put(iWindow, wi);
239
			if (wi.isModal()) {
240
				addModalDialog(iWindow, wi);
241
			} else {
242
				wss.add(iWindow, new ActionListener() {
243
					public void actionPerformed(ActionEvent e) {
244
						IWindow v = wis.getWindowById(Integer.parseInt(e
245
								.getActionCommand()));
246
						DockWindow f = dockWindowSupport.getDockWindow(v);
247
						f.restoreFocus();
248
						// activateJInternalFrame(f);
249
					}
250
				});
251
				addDockedWindow(iWindow);
252
			}
253
		}
254

  
255
		// windowRelationship.put(newWindow, iWindow);
256
		// invertedWindowRelationship.put(iWindow, newWindow);
257

  
56 258
		return iWindow;
57 259
	}
58 260

  
59
	protected JDialog addModalDialog(IWindow iWindow, WindowInfo wi) {
261
	protected Object addModalDialog(IWindow iWindow, WindowInfo wi) {
262

  
263
		// Creating dialog
60 264
		JDialog dialog = new JDialog(mainFrame, wi.getTitle());
61 265
		dialog.setContentPane((Container) iWindow);
62
		dialog.setSize(new Dimension(wi.getWidth(),wi.getHeight()));
63
		dialog.setPreferredSize(new Dimension(wi.getHeight(),wi.getWidth()));
266
		dialog.setSize(new Dimension(wi.getWidth(), wi.getHeight()));
267
		dialog.setPreferredSize(new Dimension(wi.getHeight(), wi.getWidth()));
64 268
		centerDialog(dialog);
65
		dialog.setModal(true);
269
		dialog.addWindowListener(new DialogWindowListener());
270
		dialog.setModal(wi.isModal());
271

  
272
		// Pushing dialog
273
		dialogStack.pushDialog(dialog);
274

  
275
		// Showing dialog
66 276
		dialog.setVisible(true);
277

  
67 278
		return dialog;
68 279
	}
69
	
70
	protected View addDockedWindow(IWindow iWindow, WindowInfo wi) {
71
		View view = new View(iWindow.getWindowInfo().getTitle(), null,
72
				(Component) iWindow);
73
		DockingUtil.addWindow(view, contentPanel);
74
		return view;
280

  
281
	private void addDockedWindow(IWindow iWindow) {
282
		WindowInfo wi = wis.getWindowInfo(iWindow);
283

  
284
		DockWindow wnd = dockWindowSupport.getDockWindow(iWindow);
285
		wnd.setMainFrame(mainFrame);
286
		if (iWindow instanceof SingletonWindow) {
287
			SingletonWindow sv = (SingletonWindow) iWindow;
288
			singletonSupport.openSingletonWindow(sv, wnd);
289
		}
290

  
291
		addDockedWindow(iWindow, wi);
75 292
	}
76
	
293

  
294
	private void addDockedWindow(IWindow iWindow, WindowInfo wi) {
295
		DockWindow wnd = dockWindowSupport.getDockWindow(iWindow);
296

  
297
		// if (wi.getAdditionalInfo() != null) {
298
		// if (wi.getAdditionalInfo().equals("ProjectWindow")) {
299
		// rootWindow.getWindowBar(Direction.LEFT).addTab(dockWindow);
300
		// } else if (wi.isPalette()) {
301
		// tabTools.addTab(dockWindow);
302
		// } else {
303
		// tabViews.addTab(dockWindow);
304
		// }
305
		// } else if (wi.isPalette()) {
306
		// tabTools.addTab(dockWindow);
307
		// } else {
308
		// tabViews.addTab(dockWindow);
309
		// }
310
		DockingUtil.addWindow(wnd, rootWindow);
311
		if (iWindow instanceof SingletonWindow) {
312
			SingletonWindow sv = (SingletonWindow) iWindow;
313
			singletonSupport.openSingletonWindow(sv, wnd);
314
		}
315
		updateDockWindowProperties(wnd, wi);
316
		wnd.restoreFocus();
317
	}
318

  
319
	private void updateDockWindowProperties(DockWindow frame, WindowInfo wi) {
320
		int height, width;
321
		frame.setName(wi.getTitle());
322
		frame.setVisible(wi.isVisible());
323
		// frame.setResizable(wi.isResizable());
324
		frame.getWindowProperties().setMinimizeEnabled(wi.isIconifiable());
325
		frame.getWindowProperties().setMaximizeEnabled(wi.isMaximizable());
326
		// try {
327
		// frame.setMaximum(wi.isMaximized());
328
		// } catch (PropertyVetoException e) {
329
		// TODO Auto-generated catch block
330
		// e.printStackTrace();
331
		// }
332
	}
333

  
77 334
	public IWindow addCentredWindow(IWindow iWindow)
78 335
			throws SingletonDialogAlreadyShownException {
79 336
		// TODO Auto-generated method stub
......
81 338
		return iWindow;
82 339
	}
83 340

  
84
	
85
	 /**
86
     * Situa un di?logo modal en el centro de la pantalla
87
     *
88
     * @param d
89
     *            Di?logo que se quiere situar
90
     */
91
    private void centerDialog(JDialog d) {
92
        int offSetX = d.getWidth() / 2;
93
        int offSetY = d.getHeight() / 2;
341
	/**
342
	 * Situa un di?logo modal en el centro de la pantalla
343
	 * 
344
	 * @param d
345
	 *            Di?logo que se quiere situar
346
	 */
347
	private void centerDialog(JDialog d) {
348
		int offSetX = d.getWidth() / 2;
349
		int offSetY = d.getHeight() / 2;
94 350

  
95
        d.setLocation((mainFrame.getWidth() / 2) - offSetX, (mainFrame
96
                .getHeight() / 2)
97
                - offSetY);
98
    }
351
		d.setLocation((mainFrame.getWidth() / 2) - offSetX, (mainFrame
352
				.getHeight() / 2)
353
				- offSetY);
354
	}
99 355

  
100 356
	public void changeWindowInfo(IWindow arg0, WindowInfo arg1) {
101 357
		// TODO Auto-generated method stub
......
104 360

  
105 361
	public void closeAllWindows() {
106 362
		// TODO Auto-generated method stub
363
		System.out.println("cerrando todas");
364
	}
107 365

  
366
	public boolean closeSingletonWindow(Object model) {
367
		DockWindow[] frames = (DockWindow[]) singletonSupport.getFrames(model);
368
		if (frames.length == 0)
369
			return false;
370
		for (int i = 0; i < frames.length; i++) {
371
			closeDockWindow(frames[i]);
372
		}
373
		return true;
108 374
	}
109 375

  
110
	public boolean closeSingletonWindow(Object arg0) {
111
		// TODO Auto-generated method stub
112
		return false;
376
	public boolean closeSingletonWindow(Class viewClass, Object model) {
377
		DockWindow frame = (DockWindow) singletonSupport.getFrame(viewClass,
378
				model);
379
		if (frame == null)
380
			return false;
381
		closeDockWindow(frame);
382
		return true;
113 383
	}
114 384

  
115
	public boolean closeSingletonWindow(Class arg0, Object arg1) {
116
		// TODO Auto-generated method stub
117
		return false;
385
	private void closeDockWindow(DockWindow frame) {
386
		IWindow s = (IWindow) dockWindowSupport.getWindow(frame);
387

  
388
		frame.close();
389
		callWindowClosed(s);
118 390
	}
119 391

  
392
	private void callWindowClosed(IWindow window) {
393
		if (window instanceof IWindowListener) {
394
			((IWindowListener) window).windowClosed();
395
		}
396
	}
397

  
120 398
	public void closeWindow(IWindow iWindow) {
121
		Object window = invertedWindowRelationship.get(iWindow);
122
		if (window instanceof View) {
123
			View dockingView = (View) window; 
124
			dockingView.close();
399

  
400
		if (iWindow.getWindowInfo().isModal()) {
401
			closeJDialog();
402
		} else { // Si no es modal se cierra el JInternalFrame
403
			closeDockWindow(dockWindowSupport.getDockWindow(iWindow));
125 404
		}
126
		else if (window instanceof JDialog) {
127
			JDialog dialog = (JDialog) window;
128
			dialog.dispose();
129
		}
130
			
405

  
131 406
	}
132 407

  
408
	private void closeJDialog() {
409
		JDialog dlg = dialogStack.popDialog();
410
		if (dlg == null)
411
			return;
412
		dlg.setVisible(false);
413

  
414
		// IWindow s = fws.getWindow(dlg);
415
		//
416
		// callWindowClosed(s);
417
		//
418
		// fws.closeWindow(s);
419
		//
420
		// // Si es singleton se desasocia el modelo con la vista
421
		// if (s instanceof SingletonWindow) {
422
		// sws.closeWindow((SingletonWindow) s);
423
		// }
424
	}
425

  
133 426
	public IWindow getActiveWindow() {
134 427
		// TODO Auto-generated method stub
135
		
428

  
136 429
		return getFocusWindow();
137 430
	}
138 431

  
139 432
	public IWindow[] getAllWindows() {
140
		// TODO Auto-generated method stub
141
		return null;
433
		ArrayList windows = new ArrayList();
434
		Iterator i = dockWindowSupport.getWindowIterator();
435

  
436
		while (i.hasNext()) {
437
			windows.add((IWindow) i.next());
438
		}
439
		return (IWindow[]) windows.toArray(new IWindow[0]);
142 440
	}
143 441

  
144 442
	public IWindow getFocusWindow() {
145
		View view = contentPanel.getFocusedView();
146
		return windowRelationship.get(view);		
443
		DockWindow view = (DockWindow) rootWindow.getFocusedView();
444

  
445
		if (view != null) {
446
			IWindow theView = dockWindowSupport.getWindow(view);
447
			if (theView == null)
448
				return null;
449
			return dockWindowSupport.getWindow(view);
450
		}
451
		return null;
147 452
	}
148 453

  
149 454
	public IWindow[] getOrderedWindows() {
......
153 458

  
154 459
	public WindowInfo getWindowInfo(IWindow iWindow) {
155 460
		// TODO Auto-generated method stub
156
		return infoRelationship.get(iWindow);
461
		return this.wis.getWindowInfo(iWindow);
157 462
	}
158 463

  
159

  
160 464
	public void refresh(IWindow iWindow) {
161 465
		// TODO Auto-generated method stub
162
		contentPanel.invalidate();
466
		rootWindow.invalidate();
163 467
	}
164 468

  
165 469
	public void restoreCursor() {
......
185 489

  
186 490
	public void execute(String arg0) {
187 491
		// TODO Auto-generated method stub
188
		
492

  
189 493
	}
190 494

  
191 495
	public void initialize() {
192 496
		// TODO Auto-generated method stub
193
		
497

  
194 498
	}
195 499

  
196 500
	public boolean isEnabled() {
......
203 507
		return false;
204 508
	}
205 509

  
510
	/**
511
	 * Listener para los eventos de cerrado de los di?logos. Tiene su raz?n de
512
	 * ser en que los di?logos han de devolverse al pool cuando se cierran
513
	 * 
514
	 * @author Fernando Gonz?lez Cort?s
515
	 */
516
	public class DialogWindowListener extends WindowAdapter {
517
		/**
518
		 * Captura el evento de cerrado de los di?logos con el fin de realizar
519
		 * tareas de mantenimiento
520
		 * 
521
		 * @param e
522
		 *            evento
523
		 */
524
		public void windowActivated(WindowEvent e) {
525
			// IWindow window = fws.getWindow((Component) e.getSource());
526
			// callWindowActivated(window);
527

  
528
		}
529

  
530
		/**
531
		 * Captura el evento de cerrado de los di?logos con el fin de realizar
532
		 * tareas de mantenimiento
533
		 * 
534
		 * @param e
535
		 *            evento
536
		 */
537
		public void windowClosing(WindowEvent e) {
538
			// closeJDialog();
539
		}
540
	}
541

  
206 542
}

Also available in: Unified diff