001: /*******************************************************************************
002: * Copyright (c) 2004, 2005 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: *******************************************************************************/package org.eclipse.ui.examples.components.views;
011:
012: import org.eclipse.core.resources.IFile;
013: import org.eclipse.core.resources.ResourcesPlugin;
014: import org.eclipse.core.runtime.Path;
015: import org.eclipse.swt.SWT;
016: import org.eclipse.swt.events.SelectionAdapter;
017: import org.eclipse.swt.events.SelectionEvent;
018: import org.eclipse.swt.layout.GridData;
019: import org.eclipse.swt.layout.GridLayout;
020: import org.eclipse.swt.widgets.Button;
021: import org.eclipse.swt.widgets.Composite;
022: import org.eclipse.swt.widgets.Control;
023: import org.eclipse.swt.widgets.Label;
024: import org.eclipse.swt.widgets.Text;
025: import org.eclipse.ui.IEditorDescriptor;
026: import org.eclipse.ui.ide.IDE;
027: import org.eclipse.ui.internal.components.framework.ComponentException;
028: import org.eclipse.ui.internal.components.framework.IDisposable;
029: import org.eclipse.ui.internal.components.framework.IServiceProvider;
030: import org.eclipse.ui.internal.part.Part;
031: import org.eclipse.ui.internal.part.components.services.ISystemLog;
032: import org.eclipse.ui.internal.part.components.services.IUserMessages;
033: import org.eclipse.ui.internal.part.components.services.IWorkbenchPartFactory;
034: import org.eclipse.ui.internal.part.multiplexer.Multiplexer;
035: import org.eclipse.ui.internal.part.multiplexer.MultiplexerChild;
036: import org.eclipse.ui.internal.part.multiplexer.NestedContext;
037: import org.eclipse.ui.part.FileEditorInput;
038:
039: /**
040: * @since 3.1
041: */
042: public class ViewContainingEmbeddedEditor implements IDisposable {
043: // Dependencies
044: private IWorkbenchPartFactory factory;
045: private Composite mainWidget;
046: private IUserMessages dialogs;
047: private ISystemLog errorLog;
048: private Multiplexer mplex;
049:
050: // Widgets
051: private Button openButton;
052: private Control editorComposite;
053: private Text filename;
054:
055: public ViewContainingEmbeddedEditor(Composite parent,
056: IWorkbenchPartFactory factory, IUserMessages dialogs,
057: ISystemLog errorLog, IServiceProvider services) {
058: this .factory = factory;
059: this .mainWidget = parent;
060: this .dialogs = dialogs;
061: this .errorLog = errorLog;
062: this .mplex = new Multiplexer(services);
063:
064: GridLayout layout = new GridLayout();
065: layout.numColumns = 3;
066: parent.setLayout(layout);
067:
068: Label filenameLabel = new Label(parent, SWT.NONE);
069: filenameLabel.setText("Workspace-relative path:");
070: filenameLabel.setLayoutData(new GridData(
071: GridData.HORIZONTAL_ALIGN_BEGINNING
072: | GridData.VERTICAL_ALIGN_CENTER));
073:
074: filename = new Text(parent, SWT.BORDER);
075: filename.setLayoutData(new GridData(
076: GridData.HORIZONTAL_ALIGN_FILL
077: | GridData.GRAB_HORIZONTAL
078: | GridData.VERTICAL_ALIGN_CENTER));
079:
080: openButton = new Button(parent, SWT.PUSH);
081: openButton.setText("Open");
082: openButton.setLayoutData(new GridData(
083: GridData.HORIZONTAL_ALIGN_CENTER
084: | GridData.VERTICAL_ALIGN_CENTER));
085: openButton.addSelectionListener(new SelectionAdapter() {
086: /* (non-Javadoc)
087: * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
088: */
089: public void widgetSelected(SelectionEvent e) {
090: openEditor();
091: }
092: });
093:
094: setEditor(null);
095: }
096:
097: private void setEditor(MultiplexerChild newPart) {
098: mplex.setActive(newPart);
099: if (newPart != null) {
100: setEditorComposite((Composite) newPart.getPart()
101: .getControl());
102: } else {
103: setEditorComposite(new Composite(mainWidget, SWT.NONE));
104: }
105: }
106:
107: private void setEditorComposite(Composite newComposite) {
108: editorComposite = newComposite;
109: GridData data = new GridData(GridData.FILL_BOTH);
110: data.horizontalSpan = 3;
111: editorComposite.setLayoutData(data);
112: mainWidget.layout(true);
113: }
114:
115: private void cleanupOldEditor() {
116: editorComposite.dispose();
117: }
118:
119: private void openEditor() {
120: cleanupOldEditor();
121:
122: try {
123: IFile file = ResourcesPlugin.getWorkspace().getRoot()
124: .getFile(new Path(filename.getText()));
125: if (file != null && file.exists()) {
126: IEditorDescriptor descriptor = IDE
127: .getDefaultEditor(file);
128: if (descriptor != null) {
129:
130: NestedContext context = mplex.createNested();
131: Part editor = factory.createEditor(descriptor
132: .getId(), mainWidget, new FileEditorInput(
133: file), null, context);
134:
135: MultiplexerChild child = new MultiplexerChild(
136: context, editor);
137:
138: setEditor(child);
139: return;
140: }
141: }
142: dialogs.showError("File not found", null);
143: } catch (ComponentException e) {
144: errorLog.log(e);
145: dialogs.showError("Error opening editor", e);
146: } catch (IllegalArgumentException e) {
147: dialogs.showError("File not found", e);
148: }
149:
150: setEditor(null);
151: }
152:
153: /* (non-Javadoc)
154: * @see org.eclipse.core.component.IDisposable#dispose()
155: */
156: public void dispose() {
157: cleanupOldEditor();
158: }
159: }
|