/******************************************************************************* | |
* Copyright (c) 2000, 2003 IBM Corporation and others. | |
* All rights reserved. This program and the accompanying materials | |
* are made available under the terms of the Common Public License v1.0 | |
* which accompanies this distribution, and is available at | |
* http://www.eclipse.org/legal/cpl-v10.html | |
* | |
* Contributors: | |
* IBM Corporation - initial API and implementation | |
*******************************************************************************/ | |
package org.eclipse.ui.examples.readmetool; | |
import java.io.*; | |
import org.eclipse.core.resources.IFile; | |
import org.eclipse.core.resources.IResource; | |
import org.eclipse.core.runtime.CoreException; | |
import org.eclipse.swt.SWT; | |
import org.eclipse.swt.layout.GridData; | |
import org.eclipse.swt.layout.GridLayout; | |
import org.eclipse.swt.widgets.*; | |
import org.eclipse.ui.dialogs.PropertyPage; | |
import org.eclipse.ui.help.WorkbenchHelp; | |
/** | |
* This page will be added to the property page dialog | |
* when "Properties..." popup menu item is selected | |
* for Readme files. | |
* | |
* This page demonstrates conditional property pages which look | |
* different depending on the state of the element. In this example, | |
* the arbitrary condition chosen is whether the Readme file is | |
* greater than 256 bytes in length. If it is smaller than 256 bytes | |
* in length, this will be a placeholder page containing | |
* a simple message. If it is 256 bytes or larger, additional | |
* information will be provided. This information is determined at | |
* runtime. | |
* | |
* This class may be reused to implement a conditional property page. | |
* The getPageIndex() method tests the condition and returns the | |
* index of the page to create. The createPage*() methods are called | |
* upon to create the actual pages. | |
*/ | |
public class ReadmeFilePropertyPage2 extends PropertyPage { | |
/** | |
* Utility method that creates a new composite and | |
* sets up its layout data. | |
* | |
* @param parent the parent of the composite | |
* @param numColumns the number of columns in the new composite | |
* @return the newly-created composite | |
*/ | |
protected Composite createComposite(Composite parent, int numColumns) { | |
Composite composite = new Composite(parent, SWT.NULL); | |
GridLayout layout = new GridLayout(); | |
layout.numColumns = numColumns; | |
composite.setLayout(layout); | |
GridData data = new GridData(); | |
data.verticalAlignment = GridData.FILL; | |
data.horizontalAlignment = GridData.FILL; | |
composite.setLayoutData(data); | |
return composite; | |
} | |
/** (non-Javadoc) | |
* Method declared on PreferencePage | |
*/ | |
public Control createContents(Composite parent) { | |
// ensure the page has no special buttons | |
noDefaultAndApplyButton(); | |
Composite panel = createComposite(parent, 2); | |
WorkbenchHelp.setHelp(panel, IReadmeConstants.PROPERTY_PAGE2_CONTEXT); | |
// layout the page | |
int page = getPageIndex(); | |
switch (page) { | |
case 1: | |
createPageOne(panel); | |
break; | |
case 2: | |
createPageTwo(panel); | |
break; | |
default: | |
} | |
return new Canvas(panel, 0); | |
} | |
/** | |
* Utility method that creates a new label and sets up | |
* its layout data. | |
* | |
* @param parent the parent of the label | |
* @param text the text of the label | |
* @return the newly-created label | |
*/ | |
protected Label createLabel(Composite parent, String text) { | |
Label label = new Label(parent, SWT.LEFT); | |
label.setText(text); | |
GridData data = new GridData(); | |
data.horizontalAlignment = GridData.FILL; | |
label.setLayoutData(data); | |
return label; | |
} | |
/** | |
* Creates the first version of the page. This is a placeholder page which | |
* notified the user that the page is not available. | |
* | |
* @param panel the panel in which to create the page | |
*/ | |
protected void createPageOne(Composite panel) { | |
Label l = createLabel(panel, MessageUtil.getString("Additional_Readme_properties_not_available.")); //$NON-NLS-1$ | |
GridData gd = (GridData) l.getLayoutData(); | |
gd.horizontalSpan = 2; | |
gd.grabExcessHorizontalSpace = true; | |
l = createLabel(panel, MessageUtil.getString("This_illustrates_a_property_page_that_is_dynamically_determined")); //$NON-NLS-1$ | |
gd = (GridData) l.getLayoutData(); | |
gd.horizontalSpan = 2; | |
gd.grabExcessHorizontalSpace = true; | |
l = createLabel(panel, MessageUtil.getString("not_to_be_available_based_on_the_state_of_the_object.")); //$NON-NLS-1$ | |
gd = (GridData) l.getLayoutData(); | |
gd.horizontalSpan = 2; | |
gd.grabExcessHorizontalSpace = true; | |
} | |
/** | |
* Creates the second version of the page. This page might contain more information | |
* about the file or other information. | |
* | |
* @param panel the panel in which to create the page | |
*/ | |
protected void createPageTwo(Composite panel) { | |
Label l = createLabel(panel, MessageUtil.getString("The_size_of_the_Readme_file_is_at_least_256_bytes.")); //$NON-NLS-1$ | |
GridData gd = (GridData) l.getLayoutData(); | |
gd.horizontalSpan = 2; | |
gd.grabExcessHorizontalSpace = true; | |
l = createLabel(panel, MessageUtil.getString("Had_it_been_less_than_256_bytes_this_page_would_be_a_placeholder_page.")); //$NON-NLS-1$ | |
gd = (GridData) l.getLayoutData(); | |
gd.horizontalSpan = 2; | |
gd.grabExcessHorizontalSpace = true; | |
l = createLabel(panel, MessageUtil.getString("Additional_information")); //$NON-NLS-1$ | |
gd = (GridData) l.getLayoutData(); | |
gd.horizontalSpan = 2; | |
gd.grabExcessHorizontalSpace = true; | |
l = createLabel(panel, MessageUtil.getString("This_illustrates_a_property_page_that_is_dynamically_determined")); //$NON-NLS-1$ | |
gd = (GridData) l.getLayoutData(); | |
gd.horizontalSpan = 2; | |
gd.grabExcessHorizontalSpace = true; | |
l = createLabel(panel, MessageUtil.getString("to_be_available_based_on_the_state_of_the_object.")); //$NON-NLS-1$ | |
gd = (GridData) l.getLayoutData(); | |
gd.horizontalSpan = 2; | |
gd.grabExcessHorizontalSpace = true; | |
} | |
/** | |
* Returns which page to display. This implementation | |
* answers 1 if the size of the Readme file is less than 256 bytes | |
* and 2 otherwise. | |
* | |
* @return the index of the page to display | |
*/ | |
protected int getPageIndex() { | |
IResource resource = (IResource) getElement(); | |
if (resource.getType() == IResource.FILE) { | |
InputStream contentStream = null; | |
int length = 0; | |
try { | |
IFile file = (IFile) resource; | |
if (file.isLocal(IResource.DEPTH_ZERO)) { | |
contentStream = file.getContents(); | |
Reader in = new InputStreamReader(contentStream); | |
int chunkSize = contentStream.available(); | |
StringBuffer buffer = new StringBuffer(chunkSize); | |
char[] readBuffer = new char[chunkSize]; | |
int n = in.read(readBuffer); | |
while (n > 0) { | |
buffer.append(readBuffer); | |
n = in.read(readBuffer); | |
} | |
contentStream.close(); | |
length = buffer.length(); | |
} | |
} catch (CoreException e) { | |
length = 0; | |
} catch (IOException e) { | |
} finally { | |
if (contentStream != null) { | |
try { | |
contentStream.close(); | |
} catch (IOException e) { | |
} | |
} | |
} | |
if (length < 256) | |
return 1; | |
else | |
return 2; | |
} | |
return 0; | |
} | |
/** (non-Javadoc) | |
* Method declared on PreferencePage | |
*/ | |
public boolean performOk() { | |
// nothing to do - read-only page | |
return true; | |
} | |
} |