001: /*******************************************************************************
002: * Copyright (c) 2000, 2007 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.pde.internal.ui.editor.schema;
011:
012: import org.eclipse.jface.action.ControlContribution;
013: import org.eclipse.pde.core.IModelChangedEvent;
014: import org.eclipse.pde.core.IModelChangedListener;
015: import org.eclipse.pde.internal.core.ischema.IMetaAttribute;
016: import org.eclipse.pde.internal.core.ischema.ISchema;
017: import org.eclipse.pde.internal.core.ischema.ISchemaAttribute;
018: import org.eclipse.pde.internal.core.ischema.ISchemaCompositor;
019: import org.eclipse.pde.internal.core.ischema.ISchemaElement;
020: import org.eclipse.pde.internal.core.ischema.ISchemaObject;
021: import org.eclipse.pde.internal.core.ischema.ISchemaObjectReference;
022: import org.eclipse.pde.internal.core.ischema.ISchemaRootElement;
023: import org.eclipse.pde.internal.ui.IHelpContextIds;
024: import org.eclipse.pde.internal.ui.IPDEUIConstants;
025: import org.eclipse.pde.internal.ui.PDEUIMessages;
026: import org.eclipse.pde.internal.ui.editor.PDEFormEditor;
027: import org.eclipse.pde.internal.ui.editor.PDEFormPage;
028: import org.eclipse.pde.internal.ui.editor.PDEMasterDetailsBlock;
029: import org.eclipse.pde.internal.ui.editor.PDESection;
030: import org.eclipse.pde.internal.ui.search.ShowDescriptionAction;
031: import org.eclipse.swt.SWT;
032: import org.eclipse.swt.widgets.Composite;
033: import org.eclipse.swt.widgets.Control;
034: import org.eclipse.ui.PlatformUI;
035: import org.eclipse.ui.forms.DetailsPart;
036: import org.eclipse.ui.forms.IDetailsPage;
037: import org.eclipse.ui.forms.IDetailsPageProvider;
038: import org.eclipse.ui.forms.IManagedForm;
039: import org.eclipse.ui.forms.events.HyperlinkEvent;
040: import org.eclipse.ui.forms.events.IHyperlinkListener;
041: import org.eclipse.ui.forms.widgets.ImageHyperlink;
042: import org.eclipse.ui.forms.widgets.ScrolledForm;
043:
044: public class SchemaFormPage extends PDEFormPage implements
045: IModelChangedListener {
046: public static final String PAGE_ID = "form"; //$NON-NLS-1$
047: private ElementSection fSection;
048: private SchemaBlock fBlock;
049: private DetailsPart fDetailsPart;
050: private ImageHyperlink fImageHyperlinkPreviewRefDoc;
051: private ShowDescriptionAction fPreviewAction;
052:
053: public class SchemaBlock extends PDEMasterDetailsBlock implements
054: IDetailsPageProvider {
055:
056: public SchemaBlock() {
057: super (SchemaFormPage.this );
058: }
059:
060: protected PDESection createMasterSection(
061: IManagedForm managedForm, Composite parent) {
062: fSection = new ElementSection(getPage(), parent);
063: return fSection;
064: }
065:
066: protected void registerPages(DetailsPart detailsPart) {
067: fDetailsPart = detailsPart;
068: detailsPart.setPageLimit(5);
069: detailsPart.registerPage(ISchemaObjectReference.class,
070: new SchemaElementReferenceDetails(fSection));
071: detailsPart.registerPage(ISchemaRootElement.class,
072: new SchemaRootElementDetails(fSection));
073: detailsPart.registerPage(ISchemaElement.class,
074: new SchemaElementDetails(fSection));
075: detailsPart.registerPage(ISchemaCompositor.class,
076: new SchemaCompositorDetails(fSection));
077: detailsPart.registerPage(
078: SchemaStringAttributeDetails.class,
079: new SchemaStringAttributeDetails(fSection));
080: detailsPart.registerPage(SchemaJavaAttributeDetails.class,
081: new SchemaJavaAttributeDetails(fSection));
082: detailsPart.registerPage(SchemaOtherAttributeDetails.class,
083: new SchemaOtherAttributeDetails(fSection));
084: detailsPart.setPageProvider(this );
085: }
086:
087: public Object getPageKey(Object object) {
088: if (object instanceof ISchemaObjectReference)
089: return ISchemaObjectReference.class;
090: else if (object instanceof ISchemaRootElement)
091: return ISchemaRootElement.class;
092: else if (object instanceof ISchemaElement)
093: return ISchemaElement.class;
094: else if (object instanceof ISchemaCompositor)
095: return ISchemaCompositor.class;
096: else if (object instanceof ISchemaAttribute) {
097: ISchemaAttribute att = (ISchemaAttribute) object;
098: int kind = att.getKind();
099: switch (kind) {
100: case IMetaAttribute.JAVA:
101: return SchemaJavaAttributeDetails.class;
102: case IMetaAttribute.STRING:
103: if (att
104: .getType()
105: .getName()
106: .equals(
107: ISchemaAttribute.TYPES[ISchemaAttribute.STR_IND]))
108: return SchemaStringAttributeDetails.class;
109: }
110: return SchemaOtherAttributeDetails.class;
111: } else
112: return null;
113: }
114:
115: public IDetailsPage getPage(Object object) {
116: return null;
117: }
118: }
119:
120: public SchemaFormPage(PDEFormEditor editor) {
121: super (editor, PAGE_ID,
122: PDEUIMessages.SchemaEditor_FormPage_title);
123: fBlock = new SchemaBlock();
124: }
125:
126: /* (non-Javadoc)
127: * @see org.eclipse.pde.internal.ui.editor.PDEFormPage#getHelpResource()
128: */
129: protected String getHelpResource() {
130: return IPDEUIConstants.PLUGIN_DOC_ROOT
131: + "guide/tools/editors/schema_editor/definition.htm"; //$NON-NLS-1$
132: }
133:
134: protected void createFormContent(IManagedForm managedForm) {
135: ScrolledForm form = managedForm.getForm();
136: ISchema schema = (ISchema) ((SchemaEditor) getEditor())
137: .getAggregateModel();
138:
139: if (schema.isEditable()) {
140: form.getToolBarManager().add(
141: createUIControlConPreviewRefDoc());
142: form.getToolBarManager().update(true);
143: }
144:
145: super .createFormContent(managedForm);
146: fBlock.createContent(managedForm);
147: PlatformUI.getWorkbench().getHelpSystem().setHelp(
148: form.getBody(), IHelpContextIds.SCHEMA_EDITOR_MAIN);
149: initialize();
150: }
151:
152: /**
153: * @return
154: */
155: private ControlContribution createUIControlConPreviewRefDoc() {
156: return new ControlContribution("Preview") { //$NON-NLS-1$
157: protected Control createControl(Composite parent) {
158: // Create UI
159: createUIImageHyperlinkPreviewRefDoc(parent);
160: // Create Listener
161: createUIListenerImageHyperlinkPreviewRefDoc();
162: return fImageHyperlinkPreviewRefDoc;
163: }
164: };
165: }
166:
167: /**
168: * @param parent
169: */
170: private void createUIImageHyperlinkPreviewRefDoc(Composite parent) {
171: fImageHyperlinkPreviewRefDoc = new ImageHyperlink(parent,
172: SWT.NONE);
173: fImageHyperlinkPreviewRefDoc
174: .setText(PDEUIMessages.SchemaEditor_previewLink);
175: fImageHyperlinkPreviewRefDoc.setUnderlined(true);
176: fImageHyperlinkPreviewRefDoc.setForeground(getManagedForm()
177: .getToolkit().getHyperlinkGroup().getForeground());
178: }
179:
180: /**
181: *
182: */
183: private void createUIListenerImageHyperlinkPreviewRefDoc() {
184: fImageHyperlinkPreviewRefDoc
185: .addHyperlinkListener(new IHyperlinkListener() {
186: public void linkActivated(HyperlinkEvent e) {
187: handleLinkActivatedPreviewRefDoc();
188: }
189:
190: public void linkEntered(HyperlinkEvent e) {
191: handleLinkEnteredPreviewRefDoc(e.getLabel());
192: }
193:
194: public void linkExited(HyperlinkEvent e) {
195: handleLinkExitedPreviewRefDoc();
196: }
197: });
198: }
199:
200: /**
201: * @param message
202: */
203: private void handleLinkEnteredPreviewRefDoc(String message) {
204: // Update colour
205: fImageHyperlinkPreviewRefDoc
206: .setForeground(getManagedForm().getToolkit()
207: .getHyperlinkGroup().getActiveForeground());
208: // Update IDE status line
209: getEditor().getEditorSite().getActionBars()
210: .getStatusLineManager().setMessage(message);
211: }
212:
213: /**
214: *
215: */
216: private void handleLinkExitedPreviewRefDoc() {
217: // Update colour
218: fImageHyperlinkPreviewRefDoc.setForeground(getManagedForm()
219: .getToolkit().getHyperlinkGroup().getForeground());
220: // Update IDE status line
221: getEditor().getEditorSite().getActionBars()
222: .getStatusLineManager().setMessage(null);
223: }
224:
225: /**
226: *
227: */
228: private void handleLinkActivatedPreviewRefDoc() {
229: ISchema schema = (ISchema) ((SchemaEditor) getEditor())
230: .getAggregateModel();
231: if (fPreviewAction == null) {
232: fPreviewAction = new ShowDescriptionAction(schema);
233: } else {
234: fPreviewAction.setSchema(schema);
235: }
236:
237: fPreviewAction.run();
238: }
239:
240: public void initialize() {
241: ISchema schema = (ISchema) getModel();
242: getManagedForm().getForm().setText(schema.getName());
243: schema.addModelChangedListener(this );
244: }
245:
246: public void dispose() {
247: ISchema schema = (ISchema) getModel();
248: if (schema != null)
249: schema.removeModelChangedListener(this );
250: super .dispose();
251: }
252:
253: public void modelChanged(IModelChangedEvent event) {
254: if (event.getChangeType() == IModelChangedEvent.CHANGE) {
255: String changeProperty = event.getChangedProperty();
256: if (changeProperty != null
257: && changeProperty.equals(ISchemaObject.P_NAME)) {
258: Object[] change = event.getChangedObjects();
259: if (change.length > 0 && change[0] instanceof ISchema)
260: getManagedForm().getForm().setText(
261: ((ISchema) change[0]).getName());
262: }
263: } else if (event.getChangeType() == IModelChangedEvent.WORLD_CHANGED) {
264: handleModelEventWorldChanged(event);
265: }
266: // Update master section
267: if (fSection != null) {
268: fSection.handleModelChanged(event);
269: }
270: // Update details section
271: IDetailsPage page = fDetailsPart.getCurrentPage();
272: if (page instanceof IModelChangedListener) {
273: ((IModelChangedListener) page).modelChanged(event);
274: }
275: }
276:
277: /**
278: * @param event
279: */
280: private void handleModelEventWorldChanged(IModelChangedEvent event) {
281: // Note: Cannot use event. There are no changed objects within it
282: // This method acts like a refresh
283: ISchema schema = (ISchema) getModel();
284: getManagedForm().getForm().setText(schema.getName());
285: }
286: }
|