/*******************************************************************************
* CogTool Copyright Notice and Distribution Terms
* CogTool 1.3, Copyright (c) 2005-2013 Carnegie Mellon University
* This software is distributed under the terms of the FSF Lesser
* Gnu Public License (see LGPL.txt).
*
* CogTool is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* CogTool is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with CogTool; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* CogTool makes use of several third-party components, with the
* following notices:
*
* Eclipse SWT version 3.448
* Eclipse GEF Draw2D version 3.2.1
*
* Unless otherwise indicated, all Content made available by the Eclipse
* Foundation is provided to you under the terms and conditions of the Eclipse
* Public License Version 1.0 ("EPL"). A copy of the EPL is provided with this
* Content and is also available at http://www.eclipse.org/legal/epl-v10.html.
*
* CLISP version 2.38
*
* Copyright (c) Sam Steingold, Bruno Haible 2001-2006
* This software is distributed under the terms of the FSF Gnu Public License.
* See COPYRIGHT file in clisp installation folder for more information.
*
* ACT-R 6.0
*
* Copyright (c) 1998-2007 Dan Bothell, Mike Byrne, Christian Lebiere &
* John R Anderson.
* This software is distributed under the terms of the FSF Lesser
* Gnu Public License (see LGPL.txt).
*
* Apache Jakarta Commons-Lang 2.1
*
* This product contains software developed by the Apache Software Foundation
* (http://www.apache.org/)
*
* jopt-simple version 1.0
*
* Copyright (c) 2004-2013 Paul R. Holser, Jr.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* Mozilla XULRunner 1.9.0.5
*
* The contents of this file are subject to the Mozilla Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/.
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
* License for the specific language governing rights and limitations
* under the License.
*
* The J2SE(TM) Java Runtime Environment version 5.0
*
* Copyright 2009 Sun Microsystems, Inc., 4150
* Network Circle, Santa Clara, California 95054, U.S.A. All
* rights reserved. U.S.
* See the LICENSE file in the jre folder for more information.
******************************************************************************/
package edu.cmu.cs.hcii.cogtool.ui;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.custom.TableEditor;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.events.TraverseEvent;
import org.eclipse.swt.events.TraverseListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import edu.cmu.cs.hcii.cogtool.model.Design;
import edu.cmu.cs.hcii.cogtool.model.Project;
import edu.cmu.cs.hcii.cogtool.model.URLCrawlEntry;
import edu.cmu.cs.hcii.cogtool.util.ComboWithEnableFix;
import edu.cmu.cs.hcii.cogtool.util.FontUtils;
import edu.cmu.cs.hcii.cogtool.util.GraphicsUtil;
import edu.cmu.cs.hcii.cogtool.util.IListenerAction;
import edu.cmu.cs.hcii.cogtool.util.IntegerEntry;
import edu.cmu.cs.hcii.cogtool.util.L10N;
import edu.cmu.cs.hcii.cogtool.util.ListenerIdentifier;
import edu.cmu.cs.hcii.cogtool.util.ListenerIdentifierMap;
import edu.cmu.cs.hcii.cogtool.util.OSUtils;
import edu.cmu.cs.hcii.cogtool.util.SWTStringUtil;
import edu.cmu.cs.hcii.cogtool.util.StringUtil;
import edu.cmu.cs.hcii.cogtool.util.TextWithEnableFix;
import edu.cmu.cs.hcii.cogtool.util.UndoManager;
import edu.cmu.cs.hcii.cogtool.util.WindowUtil;
public class WebCrawlImportDialog extends WindowUtil.SimpleDialog implements
ProjectInteraction.IWebCrawlImport {
/**
* Value returned from open() on success
*/
public static final Boolean OK = Boolean.TRUE;
/**
* Value returned from open() on cancel
*/
public static final Boolean CANCEL = null;
/**
* Value used as the depth value of a WebCrawler.URLCrawlEntry in the List
* returned by getURLsToCrawl() when the default depth should be used.
*/
public static final int USE_DEFAULT = URLCrawlEntry.USE_DEFAULT_DEPTH;
protected String designName = null;
protected int browserWidth = DEFAULT_BROWSER_WIDTH;
protected int browserHeight = DEFAULT_BROWSER_HEIGHT;
protected int maxPages = USE_SYSTEM_DEFAULT;
protected List<URLCrawlEntry> urlsToCrawl = null;
protected boolean pruneSameURLsFlag = false;
protected boolean capturePageImages = true;
protected int getIntegerValue(IntegerEntry entry, int defaultValue) {
String entryText = entry.getText();
return ((entryText == null) || entryText.equals("") || entryText
.equals(USE_SYSTEM_DEFAULT_VALUE)) ? defaultValue : entry
.getValue();
}
protected void saveSettings() {
String comboValue = designCombo.getText();
designName = CREATE_NEW_DESIGN.equals(comboValue)
? null
: comboValue;
browserWidth = getIntegerValue(browserWidthEntry,
DEFAULT_BROWSER_WIDTH);
browserHeight = getIntegerValue(browserHeightEntry,
DEFAULT_BROWSER_HEIGHT);
maxPages = getIntegerValue(maxPagesToImport,
USE_SYSTEM_DEFAULT);
urlsToCrawl = new ArrayList<URLCrawlEntry>();
String url = urlText.getText();
/*The last character of the restricted domain must be removed so that the restricted domain
* of "www.cmu.edu/" will also include www.cmu.edu in the webcrawl
*/
urlsToCrawl.add(new URLCrawlEntry(url, maximumDepth,
restrictedDomain
.substring(0, restrictedDomain.length() - 1)));
if (isValidURL2) {
url = urlText2.getText();
urlsToCrawl.add(new URLCrawlEntry(url, maximumDepth2,
restrictedDomain2.substring(0, restrictedDomain2
.length() - 1)));
if (isValidURL3) {
url = urlText3.getText();
urlsToCrawl.add(new URLCrawlEntry(url, maximumDepth3,
restrictedDomain3.substring(0, restrictedDomain3
.length() - 1)));
}
}
if (pruneCrawlOnSame != null) {
pruneSameURLsFlag = pruneCrawlOnSame.getSelection();
}
capturePageImages = capturePageImagesOption.getSelection();
} // saveSettings
public String getDesignName() {
return designName;
}
public int getMaxPages() {
return maxPages;
}
public int getDefaultDepth() {
return 1;
}
public List<URLCrawlEntry> getURLsToCrawl() {
return urlsToCrawl;
}
public boolean pruneSameURLs() {
return pruneSameURLsFlag;
}
public boolean captureImages() {
return capturePageImages;
}
public int getBrowserWidth() {
return browserWidth;
}
public int getBrowserHeight() {
return browserHeight;
}
public ToolBar makeToolBarButton(Composite comp,SelectionListener listener, questionImages question) {
ToolBar toolBar = new ToolBar (comp, SWT.FLAT);
ToolItem item = new ToolItem (toolBar, SWT.NONE);
Image image = null;
if(question == questionImages.PLUS_IMAGE){
image = OSUtils.MACOSX ? imagePlusMac : imagePlus;
}
else if(question == questionImages.MINUS_IMAGE){
image = OSUtils.MACOSX ? imageMinusMac : imageMinus;
}
else if(question == questionImages.QUESTION_IMAGE){
image = OSUtils.MACOSX ? questionImageMac: questionImage;
}
else if(question == questionImages.QUESTION_SHADOW){
image = OSUtils.MACOSX ? questionImageMacShadow: questionImage;
}
item.setImage (image);
item.addSelectionListener(listener);
return toolBar;
}
protected static class WebCrawlImportLID extends ListenerIdentifier {
protected String label;
protected WebCrawlImportLID(String lbl) {
label = lbl;
}
public static final WebCrawlImportLID ModifyURL = new WebCrawlImportLID(
"ModifyURL");
public static final WebCrawlImportLID ModifyDepth = new WebCrawlImportLID(
"ModifyDepth");
public static final WebCrawlImportLID DeleteURL = new WebCrawlImportLID(
"DeleteURL");
}
protected class WebCrawlImportUI implements
ListenerIdentifier.ILIDTransmuter {
/**
* Used to associate a semantic user interface action to a corresponding
* snippet of application Controller code.
*/
protected ListenerIdentifierMap lIDMap = new ListenerIdentifierMap();
public void setVisible(boolean visible) {
dialog.setVisible(visible);
}
public void takeFocus() {
dialog.setActive();
}
public IListenerAction setAction(WebCrawlImportLID id,
IListenerAction action) {
return lIDMap.setAction(id, action);
}
public boolean performAction(ListenerIdentifier id) {
return performAction(id, false);
}
public boolean performAction(ListenerIdentifier id,
boolean isContextSelection) {
return lIDMap.performAction(this, id, isContextSelection);
}
public boolean performAction(ListenerIdentifier id, Object actionParms,
boolean doCleanup) {
if (doCleanup) {
setUpPerformAction(id);
}
boolean okToProceed = lIDMap.performAction(id, actionParms);
if (doCleanup) {
cleanup(okToProceed, false);
}
return okToProceed;
}
public void setLIDEnabledState() {
// Nothing to do
}
public void setEnabled(WebCrawlImportLID id, Boolean availability,
boolean enable) {
setEnabled(id, availability, enable, null);
}
public void setEnabled(WebCrawlImportLID id, Boolean availability,
boolean enable, String newLabel) {
setEnabled(id, availability, enable, newLabel, null);
}
/**
* Not yet needed; if ever needed (such as when the LIDs defined above
* get attached to buttons, then move the implementation of setEnabled
* commented out below from AUI to a common util class.
*/
public void setEnabled(WebCrawlImportLID id, Boolean availability,
boolean enable, String newLabel, Boolean selected) {
Iterator<Object> targets = lIDMap.getWidgets(id, availability);
while (targets.hasNext()) {
Object obj = targets.next();
// move implementation of setEnabled to shared util space
// ... setEnabled(obj, enable, newLabel);
if (obj instanceof MenuItem) {
((MenuItem) obj).setSelection((selected != null)
&& selected.booleanValue());
}
}
}
protected void setUpPerformAction(ListenerIdentifier id) {
// do nothing by default; subclasses might want to override
}
public ListenerIdentifier transmute(ListenerIdentifier id,
boolean isContextSelection) {
setUpPerformAction(id);
return id;
}
public Object getParameters(ListenerIdentifier originalLID,
ListenerIdentifier transmutedLID, boolean isContextSelection) {
return UNSET;
}
public void cleanup(boolean okToContinue, boolean menuHidden) {
// nothing to do
}
}
protected static final String MODIFY_URL = L10N.get("WCI.ModifyURL",
"Modify URL");
protected static final String MODIFY_DEPTH = L10N.get("WCI.ModifyDepth",
"Modify Depth");
protected static final String ADD_URL = L10N.get("WCI.AddURL", "Add URL");
protected static final String DELETE_URL = L10N.get("WCI.DeleteURL",
"Delete URL");
protected class WebCrawlImportController {
protected WebCrawlImportUI ui;
protected UndoManager undoMgr = new UndoManager(null, true);
public WebCrawlImportController() {
ui = new WebCrawlImportUI();
}
public boolean performAction(WebCrawlImportLID id, Object actionParms,
boolean doCleanup) {
return ui.performAction(id, actionParms, doCleanup);
}
public boolean performAction(WebCrawlImportLID id, Object actionParms) {
return performAction(id, actionParms, true);
}
public void takeFocus() {
ui.takeFocus();
}
public void setVisible(boolean visible) {
ui.setVisible(visible);
}
}
protected static final Font TITLE_FONT = FontUtils.getAdjustedFont(
WindowUtil.GLOBAL_DISPLAY.getSystemFont(), 14, SWT.BOLD);
protected static final Font DESIGN_NAME_FONT = FontUtils.getAdjustedFont(
WindowUtil.GLOBAL_DISPLAY.getSystemFont(), SWT.ITALIC);
protected static final Font URL_PATH_FONT = FontUtils.getAdjustedFont(
WindowUtil.GLOBAL_DISPLAY.getSystemFont(), SWT.ITALIC);
protected static final String IMPORT_WEB_CRAWL_TITLE = L10N.get(
"WCI.ImportWebCrawlTitle", "Import HTML Pages");
protected static final String INTO_DESIGN_LABEL = L10N.get(
"WCI.IntoDesignLabel", "Import Pages Into: ");
protected static final String BROWSER_WIDTH_LABEL = L10N.get(
"WCI.BrowserWidth", "Browser Width (pixels):");
protected static final String BROWSER_HEIGHT_LABEL = L10N.get(
"WCI.BrowserHeight", "Height (pixels):");
protected static final int DEFAULT_BROWSER_WIDTH = 900;
protected static final int DEFAULT_BROWSER_HEIGHT = 600;
protected static final String CREATE_NEW_DESIGN = L10N.get(
"WCI.CreateNewDesign", "<create new design>");
protected static final String MAX_PAGES_LABEL = L10N.get(
"WCI.MaxPagesLabel", "Maximum # of Pages to Import:");
protected static final String USE_SYSTEM_DEFAULT_VALUE = L10N.get(
"WCI.UseSystemDefault", "<system default>");
protected static final String URL_SELECTION_GROUP = L10N.get(
"WCI.URLSelectionGroup", "Which URLs to Crawl:");
protected static final String SAME_URL_GROUP = L10N
.get("WCI.SameURLGroup",
"When the crawl finds a URL that the existing Design already contains:");
protected static final String SAME_URL_PRUNE_LABEL = L10N.get(
"WCI.SameURLPruneLabel",
"Keep the existing Frame and do not crawl beyond it.");
protected static final String SAME_URL_REPLACE_LABEL = L10N.get(
"WCI.SameURLReplaceLabel",
"Replace the existing Frame and keep crawling beyond it.");
protected static final String CAPTURE_IMAGES_LABEL = L10N.get(
"WCI.CaptureImagesLabel", "Capture an image for each page");
// Currently unused
protected static final String ERROR_INDICATION = L10N.get(
"WCI.ErrorIndication", "<===");
// Currently unused
protected static final String ERROR_TOOLTIP = L10N.get("WCI.ErrorTooltip",
"This value may not be empty");
// Currently unused
protected static final Color ERROR_COLOR = WindowUtil.GLOBAL_DISPLAY
.getSystemColor(SWT.COLOR_RED);
protected static final Color ENABLED_TEXT_COLOR = TextWithEnableFix.enabledColor;
protected static final Color DISABLED_TEXT_COLOR = WindowUtil.GLOBAL_DISPLAY
.getSystemColor(SWT.COLOR_DARK_GRAY);
protected Combo designCombo;
protected Group useSelectionGroup;
protected SelectionListener comboListener;
protected SelectionListener addGroupListener;
protected SelectionListener domainListener;
protected SelectionListener domainHelpListener;
protected SelectionListener depthListener;
protected int defaultMaxToCrawl;
protected int numOfGroups = 1;
protected Group typeHTMLGroup;// variables for URL #1 group
protected Button useHTML1;
protected Button useHTML2;
protected Button useHTML3;
protected Label urlPath1;
protected Label urlPath2;
protected Label urlPath3;
protected Label urlPath3b;
protected Text urlText;
protected Label maximumDepthToCrawlLabel;
protected Combo maxDepthCombo;
protected int maximumDepth = 0;
protected Label restrictDomainLabel;
protected String restrictedDomain = "Unrestricted ";
protected ToolBar questionMarkButtonDepth;
protected ToolBar questionMarkButtonDomain;
protected ToolBar plusButton;
protected ToolBar minusButton;
protected SelectionListener minusGroupListener1;
protected boolean isValidURL = false;
protected Group typeHTMLGroup2;// variables for URL #2 group
protected Button useHTML4;
protected Button useHTML5;
protected Button useHTML6;
protected Label urlPath4;
protected Label urlPath5;
protected Label urlPath6;
protected Label urlPath6b;
protected Text urlText2;
protected Combo maxDepthCombo2;
protected Label maximumDepthToCrawlLabel2;
protected Label restrictDomainLabel2;
protected int maximumDepth2 = 0;
protected String restrictedDomain2 = "Unrestricted ";
protected ToolBar questionMarkButtonDepth2;
protected ToolBar questionMarkButtonDomain2;
protected ToolBar plusButton2;
protected ToolBar minusButton2;
protected boolean firstSecondAdd = true;
protected SelectionListener minusGroupListener2;
protected boolean isValidURL2 = false;
protected Group typeHTMLGroup3;// variables for URL #3 group
protected Button useHTML7;
protected Button useHTML8;
protected Button useHTML9;
protected Label urlPath7;
protected Label urlPath8;
protected Label urlPath9;
protected Label urlPath9b;
protected Text urlText3;
protected Combo maxDepthCombo3;
protected int maximumDepth3 = 0;
protected Label restrictDomainLabel3;
protected String restrictedDomain3 = "Unrestricted ";
protected ToolBar questionMarkButtonDepth3;
protected ToolBar questionMarkButtonDomain3;
protected Label maximumDepthToCrawlLabel3;
protected ToolBar plusButton3;
protected ToolBar minusButton3;
protected SelectionListener minusGroupListener3;
protected boolean isValidURL3 = false;
protected Group sameURLGroup;
protected Button pruneCrawlOnSame;
protected Button replacePageOnSame;
protected Button capturePageImagesOption;
protected ToolBar questionMarkButtonCaptureImage;
protected Label maxPagesLabel;
protected IntegerEntry maxPagesToImport;
protected ToolBar questionMarkButtonMaxPages;
protected IntegerEntry browserWidthEntry;
protected IntegerEntry browserHeightEntry;
protected MessageBox messageBox;
protected Button okButton;
protected Button cancelButton;
protected ScrolledComposite sc1;
protected Composite comp;
protected TableEditor editor;
protected Object wasEditing = null; // one of EDITING_URL or EDITING_DEPTH
protected Project project;
protected String[] allowedProtocols = // do these protocols always have "//"
new String[] { "http://", "https://", "file://" };
private static int SITE_INVALID = 1;
private static int SITE_VALID = 2;
private static int SITE_EXCEPTION = 4;
private static int SITE_BAD_EXTENSION = 8;
protected Image questionImage;
protected Image imagePlus;
protected Image imageMinus;
protected Image imagePlusMac;
protected Image imagePlusMacDisabled;
protected Image imageMinusMac;
protected Image imageMinusMacDisabled;
protected Image questionImageMac;
protected Image questionImageMacShadow;
public enum questionImages { PLUS_IMAGE, MINUS_IMAGE, QUESTION_IMAGE, QUESTION_SHADOW}
// TODO factor out this question mark stuff into a general mechanism
// to be shared elsewhere
protected WebCrawlImportController controller = new WebCrawlImportController();
public WebCrawlImportDialog(Shell parentWin, Project proj,
int sysDefaultMaxToCrawl) {
super(parentWin, IMPORT_WEB_CRAWL_TITLE, SWT.PRIMARY_MODAL,
SWT.DIALOG_TRIM | SWT.RESIZE);
project = proj;
defaultMaxToCrawl = sysDefaultMaxToCrawl;
}
protected static class ManageSystemDefault implements FocusListener {
protected IntegerEntry entry;
protected int defaultValue;
protected int maxValue;
public ManageSystemDefault(IntegerEntry e, int value, int maxValue) {
entry = e;
defaultValue = value;
this.maxValue = maxValue;
}
public void focusGained(FocusEvent evt) {
if (USE_SYSTEM_DEFAULT_VALUE.equals(entry.getText())) {
entry.setText("");
}
}
public void focusLost(FocusEvent evt) {
String text = entry.getText();
if (text.length() > 10 || text.length() == 0) {
setDefault();
return;
}
Long longNumber = Long.parseLong(text);
if (longNumber > maxValue || longNumber == 0) {
setDefault();
}
}
public void setDefault() {
entry.setText(USE_SYSTEM_DEFAULT_VALUE);
entry.setText("" + defaultValue);
}
}
protected class TextFocusListener implements FocusListener {
protected int group;
protected Text textBox;
protected Label label2;
protected Label label3;
protected Button button1;
protected Button button2;
protected Button button3;
//label1 always says "Unrestricted" so we do not need to edit label1.
public TextFocusListener(Text textBox, Label label2, Label label3, Button button1,
Button button2, Button button3, int group) {
this.group = group;
this.textBox = textBox;
this.label2 = label2;
this.label3 = label3;
this.button1 = button1;
this.button2 = button2;
this.button3 = button3;
}
public void focusGained(FocusEvent evt) {
textBox.setForeground(ENABLED_TEXT_COLOR);
}
public void focusLost(FocusEvent evt) {
button1.setSelection(true);
button2.setSelection(false);
button3.setSelection(false);
button2.setEnabled(true);
button3.setEnabled(true);
switch(group){
case 1: restrictedDomain = "Unrestricted ";
break;
case 2: restrictedDomain2 = "Unrestricted ";
break;
case 3: restrictedDomain3 = "Unrestricted ";
break;
}
String text = textBox.getText().trim();
if (text.equals("")) {
label2.setText("http://www.host_name/");
label3.setText("http://www.host_name/path");
label2.setFont(URL_PATH_FONT);
clearExtraLabel(group, URL_PATH_FONT);
button2.setEnabled(false);
button3.setEnabled(false);
}
else {
label2.setText(secondDomain(text, button2, label2));
String thirdD = thirdDomain(text, label2.getText(), button3,
group);
thirdD = SWTStringUtil.insertEllipsis(thirdD,
StringUtil.EQUAL, label3.getFont());
label3.setText(thirdD);
}
repaint();
}
}
public void displaySecondGroup(boolean setVisible) {
if (setVisible) {
urlText2.setText("http://");
urlPath4.setText("Unrestricted");
urlPath5.setText("http://www.host_name/");
urlPath5.setFont(URL_PATH_FONT);
urlPath6.setText("http://www.host_name/path");
urlPath6.setFont(URL_PATH_FONT);
if (urlPath6b != null) {
urlPath6b.setVisible(false);
}
maxDepthCombo2.select(2);
useHTML5.setEnabled(false);
useHTML6.setEnabled(false);
useHTML4.setSelection(true);
useHTML5.setSelection(false);
useHTML6.setSelection(false);
}
typeHTMLGroup2.setVisible(setVisible);
plusButton2.setVisible(setVisible);
minusButton2.setVisible(setVisible);
useHTML4.setVisible(setVisible);
useHTML5.setVisible(setVisible);
useHTML6.setVisible(setVisible);
urlPath4.setVisible(setVisible);
urlPath5.setVisible(setVisible);
urlPath6.setVisible(setVisible);
urlText2.setVisible(setVisible);
maxDepthCombo2.setVisible(setVisible);
questionMarkButtonDepth2.setVisible(setVisible);
questionMarkButtonDomain2.setVisible(setVisible);
minusButton.setEnabled(setVisible);
if(OSUtils.MACOSX){
if(setVisible){
minusButton.getItem(0).setImage(imageMinusMac);
}
else{
minusButton.getItem(0).setImage(imageMinusMacDisabled);
}
}
restrictDomainLabel2.setVisible(setVisible);
maximumDepthToCrawlLabel2.setVisible(setVisible);
if (! setVisible) {
FormData formData = new FormData();
typeHTMLGroup2.setLayoutData(formData);
useHTML4.setLayoutData(formData);
useHTML5.setLayoutData(formData);
useHTML6.setLayoutData(formData);
urlPath4.setLayoutData(formData);
urlPath5.setLayoutData(formData);
urlPath6.setLayoutData(formData);
maxDepthCombo2.setLayoutData(formData);
maximumDepthToCrawlLabel2.setLayoutData(formData);
plusButton2.setLayoutData(formData);
minusButton2.setLayoutData(formData);
questionMarkButtonDepth2.setLayoutData(formData);
questionMarkButtonDomain2.setLayoutData(formData);
restrictDomainLabel2.setLayoutData(formData);
urlPath6b.setVisible(false);
}
}
public void displayThirdGroup(boolean setVisible) {
typeHTMLGroup3.setVisible(setVisible);
plusButton3.setVisible(setVisible);
minusButton3.setVisible(setVisible);
useHTML7.setVisible(setVisible);
useHTML8.setVisible(setVisible);
useHTML9.setVisible(setVisible);
urlPath7.setVisible(setVisible);
urlPath8.setVisible(setVisible);
urlPath9.setVisible(setVisible);
urlText3.setVisible(setVisible);
maxDepthCombo3.setVisible(setVisible);
maximumDepthToCrawlLabel3.setVisible(setVisible);
questionMarkButtonDepth3.setVisible(setVisible);
questionMarkButtonDomain3.setVisible(setVisible);
restrictDomainLabel3.setVisible(setVisible);
enablePlusButtons(! setVisible);
if (setVisible) {
urlText3.setText("http://");
urlPath7.setText("Unrestricted");
urlPath8.setText("http://www.host_name/");
urlPath8.setFont(URL_PATH_FONT);
urlPath9.setText("http://www.host_name/path");
urlPath9.setFont(URL_PATH_FONT);
urlPath9b.setVisible(false);
maxDepthCombo3.select(2);
useHTML8.setEnabled(false);
useHTML9.setEnabled(false);
useHTML7.setSelection(true);
useHTML8.setSelection(false);
useHTML9.setSelection(false);
}
if (! setVisible) {
FormData formData = new FormData();
typeHTMLGroup3.setLayoutData(formData);
useHTML7.setLayoutData(formData);
useHTML8.setLayoutData(formData);
useHTML9.setLayoutData(formData);
urlPath7.setLayoutData(formData);
urlPath8.setLayoutData(formData);
urlPath9.setLayoutData(formData);
maxDepthCombo3.setLayoutData(formData);
maximumDepthToCrawlLabel3.setLayoutData(formData);
plusButton3.setLayoutData(formData);
minusButton3.setLayoutData(formData);
questionMarkButtonDepth3.setLayoutData(formData);
questionMarkButtonDomain3.setLayoutData(formData);
restrictDomainLabel3.setLayoutData(formData);
urlPath9b.setVisible(false);
}
}
public void enablePlusButtons(boolean enable) {
plusButton.setEnabled(enable);
plusButton2.setEnabled(enable);
plusButton3.setEnabled(enable);
if(OSUtils.MACOSX){
Image plusButtonImage= enable ? imagePlusMac : imagePlusMacDisabled;
plusButton.getItem(0).setImage(plusButtonImage);
plusButton2.getItem(0).setImage(plusButtonImage);
plusButton3.getItem(0).setImage(plusButtonImage);
}
}
@Override
protected void buildDialog() {
dialog.setLayout(new FillLayout());
dialog.setMinimumSize(485, 325);// 525, 350
sc1 = new ScrolledComposite(dialog, SWT.H_SCROLL
| SWT.V_SCROLL | SWT.BORDER);
sc1.setLayout(new FillLayout());
comp = new Composite(sc1, SWT.NONE);
comp.setLayout(new FormLayout());
//different images needed to match the different backgrounds of the dialog box
questionImage = GraphicsUtil.getImageFromResource("edu/cmu/cs/hcii/cogtool/resources/question_button.jpg");
questionImageMac = GraphicsUtil.getImageFromResource("edu/cmu/cs/hcii/cogtool/resources/question_button_mac.jpg");
questionImageMacShadow = GraphicsUtil.getImageFromResource("edu/cmu/cs/hcii/cogtool/resources/question_button_shadow.jpg");
imagePlus = GraphicsUtil.getImageFromResource("edu/cmu/cs/hcii/cogtool/resources/plus_sign.jpg");
imagePlusMac = GraphicsUtil.getImageFromResource("edu/cmu/cs/hcii/cogtool/resources/plus_sign_mac.jpg");
imagePlusMacDisabled = GraphicsUtil.getImageFromResource("edu/cmu/cs/hcii/cogtool/resources/plus_sign_mac_disabled.jpg");
imageMinus = GraphicsUtil.getImageFromResource("edu/cmu/cs/hcii/cogtool/resources/minus_sign.jpg");
imageMinusMac = GraphicsUtil.getImageFromResource("edu/cmu/cs/hcii/cogtool/resources/minus_sign_mac.jpg");
imageMinusMacDisabled = GraphicsUtil.getImageFromResource("edu/cmu/cs/hcii/cogtool/resources/minus_sign_mac_disabled.jpg");
Label dialogTitle = new Label(comp, SWT.NONE);
dialogTitle.setText(IMPORT_WEB_CRAWL_TITLE);
dialogTitle.setFont(TITLE_FONT);
Label intoDesignLbl = new Label(comp, SWT.NONE);
intoDesignLbl.setText(INTO_DESIGN_LABEL);
designCombo = new ComboWithEnableFix(comp, SWT.DROP_DOWN
| SWT.READ_ONLY);
designCombo.add(CREATE_NEW_DESIGN);
Iterator<Design> designs = project.getDesigns().iterator();
while (designs.hasNext()) {
Design design = designs.next();
designCombo.add(SWTStringUtil.insertEllipsis(design.getName(),
StringUtil.EQUAL, designCombo.getFont()));
// TODO: We'll need to observe Design name changes if
// it ever becomes possible to change a design name other than
// through the Project editor -- remember to remove the handler
// when this dialog box gets disposed!
}
designCombo.select(0);
designCombo.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent evt) {
String selectedName = designCombo.getText();
Design design = project.getDesign(selectedName);
if (design != null) {
if (sameURLGroup == null) {
buildSameURLGroup();
}
//insert the name of the selected Design into the Group Label
int index = SAME_URL_GROUP.indexOf("Design") + 6;
String titleGroup = SAME_URL_GROUP.substring(0, index);
titleGroup += " (" + design.getName() + ")";
titleGroup += SAME_URL_GROUP.substring(index);
sameURLGroup.setText(titleGroup);
displaySameURLGroup(true);
}
else if (sameURLGroup != null) {
displaySameURLGroup(false);
}
repaint();
}
});
designCombo.addTraverseListener(new TraverseListener() {
public void keyTraversed(TraverseEvent evt) {
if (evt.detail == SWT.TRAVERSE_TAB_NEXT) {
evt.detail = SWT.TRAVERSE_NONE;
urlText.forceFocus();
}
}
});
useSelectionGroup = new Group(comp, SWT.SHADOW_NONE);
useSelectionGroup.setText(URL_SELECTION_GROUP);
useSelectionGroup.setLayout(new FormLayout());
typeHTMLGroup = new Group(useSelectionGroup, SWT.SHADOW_NONE);
typeHTMLGroup.setText("Starting URL #1");
typeHTMLGroup.setLayout(new FormLayout());
urlText = new TextWithEnableFix(typeHTMLGroup, SWT.BORDER
| SWT.SINGLE);
urlText.setText("http://");
urlText.addTraverseListener(new TraverseListener() {
public void keyTraversed(TraverseEvent e) {
if (e.detail == SWT.TRAVERSE_TAB_PREVIOUS) {
e.detail = SWT.TRAVERSE_NONE;
designCombo.forceFocus();
}
}
});
addGroupListener = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent evt) {
if (numOfGroups == 1) {
if (urlText2 == null) {
buildSecondGroup();
}
displaySecondGroup(true);
FormData formData = new FormData();
formData.top = new FormAttachment(typeHTMLGroup, 5,
SWT.BOTTOM);
formData.left = new FormAttachment(typeHTMLGroup, 0,
SWT.LEFT);
formData.right = new FormAttachment(100, -6);
typeHTMLGroup2.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(typeHTMLGroup2, 5,
SWT.TOP);
formData.left = new FormAttachment(urlText, 0, SWT.LEFT);
formData.right = new FormAttachment(urlText, 350, SWT.LEFT);
urlText2.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(urlText2, 1, SWT.TOP);
formData.left = new FormAttachment(urlText2, 5, SWT.RIGHT);
plusButton2.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(plusButton2, 5, SWT.TOP);
formData.left = new FormAttachment(plusButton2, 10,
SWT.RIGHT);
minusButton2.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(urlText2, 5, SWT.BOTTOM);
formData.left = new FormAttachment(urlText2, 10, SWT.LEFT);
maximumDepthToCrawlLabel2.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(
maximumDepthToCrawlLabel2, 0, SWT.TOP);
formData.left = new FormAttachment(
maximumDepthToCrawlLabel2, 3, SWT.RIGHT);
questionMarkButtonDepth2.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(
maximumDepthToCrawlLabel2, 0, SWT.TOP);
formData.left = new FormAttachment(
questionMarkButtonDepth2, 10, SWT.RIGHT);
maxDepthCombo2.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(
maximumDepthToCrawlLabel2, 15, SWT.BOTTOM);
formData.left = new FormAttachment(urlText2, 10, SWT.LEFT);
restrictDomainLabel2.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(restrictDomainLabel2, 0,
SWT.TOP);
formData.left = new FormAttachment(restrictDomainLabel2,
3, SWT.RIGHT);
questionMarkButtonDomain2.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(restrictDomainLabel2, 10,
SWT.BOTTOM);
formData.left = new FormAttachment(0, 25);
useHTML4.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(useHTML4, 0, SWT.TOP);
formData.left = new FormAttachment(useHTML4, 0, SWT.RIGHT);
urlPath4.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(useHTML4, 8, SWT.BOTTOM);
formData.left = new FormAttachment(useHTML4, 0, SWT.LEFT);
useHTML5.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(useHTML5, 0, SWT.TOP);
formData.left = new FormAttachment(useHTML5, 0, SWT.RIGHT);
urlPath5.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(useHTML5, 8, SWT.BOTTOM);
formData.left = new FormAttachment(useHTML5, 0, SWT.LEFT);
useHTML6.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(useHTML6, 0, SWT.TOP);
formData.left = new FormAttachment(useHTML6, 0, SWT.RIGHT);
urlPath6.setLayoutData(formData);
formData = new FormData();
formData.left = new FormAttachment(urlPath6, 0, SWT.RIGHT);
formData.top = new FormAttachment(urlPath6, 0, SWT.TOP);
urlPath6b.setLayoutData(formData);
minusButton.setEnabled(true);
if(OSUtils.MACOSX){
minusButton.getItem(0).setImage(imageMinusMac);
}
numOfGroups++;
repaint();
}
else if(numOfGroups == 2){
if (urlText3 == null) {
buildThirdGroup();
}
displayThirdGroup(true);
FormData formData = new FormData();
formData.top = new FormAttachment(typeHTMLGroup2, 5,
SWT.BOTTOM);
formData.left = new FormAttachment(typeHTMLGroup2, 0,
SWT.LEFT);
formData.right = new FormAttachment(100, -6);
typeHTMLGroup3.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(typeHTMLGroup3, 5,
SWT.TOP);
formData.left = new FormAttachment(urlText2, 0, SWT.LEFT);
formData.right = new FormAttachment(urlText2, 350, SWT.LEFT);
urlText3.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(urlText3, 1, SWT.TOP);
formData.left = new FormAttachment(urlText3, 5, SWT.RIGHT);
plusButton3.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(plusButton3, 4, SWT.TOP);
formData.left = new FormAttachment(plusButton3, 10,
SWT.RIGHT);
minusButton3.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(urlText3, 5, SWT.BOTTOM);
formData.left = new FormAttachment(urlText3, 10, SWT.LEFT);
maximumDepthToCrawlLabel3.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(
maximumDepthToCrawlLabel3, 0, SWT.TOP);
formData.left = new FormAttachment(
maximumDepthToCrawlLabel3, 3, SWT.RIGHT);
questionMarkButtonDepth3.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(
maximumDepthToCrawlLabel3, 0, SWT.TOP);
formData.left = new FormAttachment(
questionMarkButtonDepth3, 10, SWT.RIGHT);
maxDepthCombo3.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(
maximumDepthToCrawlLabel3, 15, SWT.BOTTOM);
formData.left = new FormAttachment(urlText3, 10, SWT.LEFT);
restrictDomainLabel3.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(restrictDomainLabel3, 0,
SWT.TOP);
formData.left = new FormAttachment(restrictDomainLabel3,
3, SWT.RIGHT);
questionMarkButtonDomain3.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(restrictDomainLabel3, 10,
SWT.BOTTOM);
formData.left = new FormAttachment(0, 25);
useHTML7.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(useHTML7, 0, SWT.TOP);
formData.left = new FormAttachment(useHTML7, 0, SWT.RIGHT);
urlPath7.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(useHTML7, 8, SWT.BOTTOM);
formData.left = new FormAttachment(useHTML7, 0, SWT.LEFT);
useHTML8.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(useHTML8, 0, SWT.TOP);
formData.left = new FormAttachment(useHTML8, 0, SWT.RIGHT);
urlPath8.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(useHTML8, 8, SWT.BOTTOM);
formData.left = new FormAttachment(useHTML8, 0, SWT.LEFT);
useHTML9.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(useHTML9, 0, SWT.TOP);
formData.left = new FormAttachment(useHTML9, 0, SWT.RIGHT);
urlPath9.setLayoutData(formData);
formData = new FormData();
formData.left = new FormAttachment(urlPath9, 0, SWT.RIGHT);
formData.top = new FormAttachment(urlPath9, 0, SWT.TOP);
urlPath9b.setLayoutData(formData);
numOfGroups++;
repaint();
}
}
};
minusGroupListener1 = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent evt) {
if(numOfGroups > 1){
moveGroupTwoToOne();
minusGroupTwo();
}
}
};
plusButton = makeToolBarButton(typeHTMLGroup, addGroupListener, questionImages.PLUS_IMAGE);
minusButton = makeToolBarButton(typeHTMLGroup, minusGroupListener1, questionImages.MINUS_IMAGE);
minusButton.setEnabled(false);
if(OSUtils.MACOSX){
minusButton.getItem(0).setImage(imageMinusMacDisabled);
}
maximumDepthToCrawlLabel = new Label(typeHTMLGroup, SWT.NONE);
maximumDepthToCrawlLabel.setText("Maximum Depth To Crawl: ");
depthListener = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent evt) {
messageBox(
"Select 0 to import only the page at the URL you entered.\n" +
"Select 1 to import that page and all pages a user could " +
"get to by clicking one link.\n" +
"Select 2 to import that page and all pages a user could " +
"get to by clicking two links.\n" +
"Etc.\n" +
"Select Unlimited to allow any page accessible from the " +
"URL you entered, no matter how many links need to be " +
"clicked to get there. However, to avoid importing the " +
"entire Web, consider restricting the domain or entering " +
"a maximum number of pages to import.",
SWT.ICON_INFORMATION);
}
};
questionMarkButtonDepth = makeToolBarButton(typeHTMLGroup, depthListener, questionImages.QUESTION_SHADOW);
maxDepthCombo = new ComboWithEnableFix(typeHTMLGroup,
SWT.DROP_DOWN | SWT.READ_ONLY);
maxDepthCombo.add("Unlimited");
for (int i = 0; i < 100; i++) {
maxDepthCombo.add("" + i);
}
maxDepthCombo.select(2);
maxDepthCombo.setVisibleItemCount(21);
maximumDepth = 1;
maximumDepth2 = 1;
maximumDepth3 = 1;
comboListener = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent evt) {
maximumDepth = Integer.MAX_VALUE;
if (! maxDepthCombo.getText().equals("Unlimited")) {
maximumDepth = Integer.parseInt(maxDepthCombo.getText());
}
if ((maxDepthCombo2 != null) && (maxDepthCombo2.getVisible())) {
maximumDepth2 = Integer.MAX_VALUE;
if (! maxDepthCombo2.getText().equals("Unlimited")) {
maximumDepth2 = Integer.parseInt(maxDepthCombo2.getText());
}
}
if ((maxDepthCombo3 != null) && (maxDepthCombo3.getVisible())) {
maximumDepth3 = Integer.MAX_VALUE;
if (! maxDepthCombo3.getText().equals("Unlimited")) {
maximumDepth3 = Integer.parseInt(maxDepthCombo3.getText());
}
}
}
};
maxDepthCombo.addSelectionListener(comboListener);
restrictDomainLabel = new Label(typeHTMLGroup, SWT.NONE);
restrictDomainLabel.setText("Restrict Domain: ");
domainHelpListener = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent evt) {
messageBox(
"Select Unlimited to import any pages that could be reached " +
"from the URL entered above. " +
"The radio buttons reflect the host name and path name of the URL " +
"entered above. Select a more restrictive radio button to only import " +
"pages whose URL begins as shown.\n\n" +
"It is useful to restrict the domain when you want to evaluate a " +
"particular site, but that site points out to other places on the Web.",
SWT.ICON_INFORMATION);
}
};
questionMarkButtonDomain = makeToolBarButton(typeHTMLGroup, domainHelpListener, questionImages.QUESTION_SHADOW);
questionMarkButtonDomain
.addTraverseListener(new TraverseListener() {
public void keyTraversed(TraverseEvent e) {
if (e.detail == SWT.TRAVERSE_TAB_NEXT) {
if (numOfGroups > 1) {
e.detail = SWT.TRAVERSE_NONE;
urlText2.forceFocus();
}
}
}
});
minusGroupListener2 = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent evt)
{
minusGroupTwo();
}
};
minusGroupListener3 = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent evt)
{
numOfGroups--;
displayThirdGroup(false);
repaint();
}
};
useHTML1 = new Button(typeHTMLGroup, SWT.RADIO);
useHTML1.setSelection(true);
domainListener = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent evt) {
if (useHTML1.getSelection()) {
restrictedDomain = "Unrestricted ";
}
else if (useHTML2.getSelection()) {
restrictedDomain = urlPath2.getText();
}
else {
restrictedDomain = urlPath3.getText();
}
if ((useHTML4 != null) && (useHTML4.getSelection())) {
restrictedDomain2 = "Unrestricted ";
}
else if ((useHTML5 != null) && (useHTML5.getSelection())) {
restrictedDomain2 = urlPath5.getText();
}
else if (useHTML6 != null) {
restrictedDomain2 = urlPath6.getText();
}
if ((useHTML7 != null) && (useHTML7.getSelection())) {
restrictedDomain3 = "Unrestricted ";
}
else if ((useHTML8 != null) && (useHTML8.getSelection())) {
restrictedDomain3 = urlPath8.getText();
}
else if (useHTML9 != null) {
restrictedDomain3 = urlPath9.getText();
}
}
};
useHTML1.addSelectionListener(domainListener);
useHTML1.setSelection(true);
useHTML2 = new Button(typeHTMLGroup, SWT.RADIO);
useHTML2.addSelectionListener(domainListener);
useHTML2.setEnabled(false);
useHTML3 = new Button(typeHTMLGroup, SWT.RADIO);
useHTML3.addSelectionListener(domainListener);
useHTML3.setEnabled(false);
urlPath1 = new Label(typeHTMLGroup, SWT.NONE);
urlPath1.setText("Unrestricted");
urlPath2 = new Label(typeHTMLGroup, SWT.NONE);
urlPath2.setText("http://www.host_name/");
urlPath2.setFont(URL_PATH_FONT);
urlPath3 = new Label(typeHTMLGroup, SWT.NONE);
urlPath3.setText("http://www.host_name/path");
urlPath3.setFont(URL_PATH_FONT);
urlPath3b = new Label(typeHTMLGroup, SWT.NONE);
urlPath3b.setText("path");
urlPath3b.setFont(URL_PATH_FONT);
urlPath3b.setVisible(false);
urlText.addFocusListener(new TextFocusListener(urlText, urlPath2,
urlPath3, useHTML1,useHTML2, useHTML3, 1));
capturePageImagesOption = new Button(comp, SWT.CHECK);
capturePageImagesOption.setText(CAPTURE_IMAGES_LABEL);
capturePageImagesOption.setSelection(capturePageImages);
SelectionListener imageListener = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent evt) {
messageBox(
"Check this box to set a picture of each page as the background of " +
"its frame. The picture will be the size of the browser width and " +
"height set below, so it will not be of the entire page if the user " +
"would have to scroll to see it all.\n\n" +
"It is useful to capture pictures to convey the look of the site in " +
"presentations, but CogTool predictions will not be affected by " +
"having a picture or not. Having pictures increases the size of " +
"CogTool project files and having many of them may slow down interaction.",
SWT.ICON_INFORMATION);
}
};
questionMarkButtonCaptureImage = makeToolBarButton(comp, imageListener, questionImages.QUESTION_IMAGE);
maxPagesToImport = new IntegerEntry(comp, SWT.BORDER);
maxPagesToImport.setAllowNegative(false);
maxPagesToImport.setText(USE_SYSTEM_DEFAULT_VALUE);
maxPagesToImport.setText("500");
maxPagesToImport.addFocusListener(new ManageSystemDefault(
maxPagesToImport, 500, Integer.MAX_VALUE));
maxPagesLabel = new Label(comp, SWT.NONE);
maxPagesLabel.setText(MAX_PAGES_LABEL);
SelectionListener pagesListener = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent evt) {
messageBox(
"Use this field to limit the number of pages imported into a design. " +
"It is especially important to use a reasonable maximum when you have " +
"not restricted the domain and have specified a maximum depth greater " +
"than 2. " +
"The default, 500 pages, is sufficient for most projects, but leave " +
"the field empty to have no restriction at all",
SWT.ICON_INFORMATION);
}
};
questionMarkButtonMaxPages = makeToolBarButton(comp, pagesListener, questionImages.QUESTION_IMAGE);
Label browserWidthLbl = new Label(comp, SWT.NONE);
browserWidthLbl.setText(BROWSER_WIDTH_LABEL);
Label browserHeightLbl = new Label(comp, SWT.NONE);
browserHeightLbl.setText(BROWSER_HEIGHT_LABEL);
browserWidthEntry = new IntegerEntry(comp, SWT.BORDER);
browserWidthEntry.setAllowNegative(false);
browserWidthEntry.setText(USE_SYSTEM_DEFAULT_VALUE);
browserWidthEntry.setText("900");
browserWidthEntry.addFocusListener(new ManageSystemDefault(
browserWidthEntry, 900, 2100));
browserHeightEntry = new IntegerEntry(comp, SWT.BORDER);
browserHeightEntry.setAllowNegative(false);
browserHeightEntry.setText(USE_SYSTEM_DEFAULT_VALUE);
browserHeightEntry.setText("600");
browserHeightEntry.addFocusListener(new ManageSystemDefault(
browserHeightEntry, 600, 1200));
okButton = new Button(comp, SWT.PUSH);
okButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseUp(MouseEvent evt) {
wasEditing = null;
}
});
okButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent evt) {
Text textBox = null;
String text = null;
String errorText = "";
int count = 1;
boolean proceed = false;
isValidURL = false;
isValidURL2 = false;
isValidURL3 = false;
HashMap<Integer, String> errorMap = new HashMap<Integer, String>();
errorMap.put(SITE_VALID, "");
errorMap.put(SITE_INVALID, "The given URL for URL #");
errorMap.put(SITE_BAD_EXTENSION, "The given extension for URL # ");
errorMap.put(SITE_EXCEPTION,"");
/*
* The while loop checks all three of the given URLs, the loop
* breaks if the user has not entered up to 3 urls
*/
boolean exception=false;
while (count < 4) {
textBox = null;
proceed = false;
if (count == 1) {
/*
* Trim is needed to ensure all leading and trailing
* spaces are eliminated. checkProtocol(text, boolean)
* checks to make sure that there is valid protocol
*/
textBox = urlText;
text = urlText.getText().trim();
proceed = checkProtocol(text, true);
}
else if (count == 2) {
if (numOfGroups > 1) {
textBox = urlText2;
text = textBox.getText().trim();
proceed = checkProtocol(text, true);
}
else {
break;
}
}
else if (count == 3) {
if (numOfGroups > 2) {
textBox = urlText3;
text = textBox.getText().trim();
proceed = checkProtocol(text, true);
} else {
break;
}
}
/* There was not a valid protocol at the
* first try so now append http:// at the beginning so there
* will be a valid protocol. For example, if the user enters
* www.cmu.edu, http:// is appended here because a protocol
* is needed to check to see if the url is valid.
*/
if (! proceed) {
try {
proceed = checkProtocol(URLCrawlEntry
.ensureAbsolute(text), true);
if (proceed) {
textBox.setText("http://" + text);
}
} catch (Exception ex) {
}
}
if (proceed) {
String givenURL = textBox.getText().trim();
if ("".equals(givenURL)) {
textBox.setText(USE_SYSTEM_DEFAULT_VALUE);
textBox.setForeground(DISABLED_TEXT_COLOR);
}
String st = givenURL
.substring(givenURL.indexOf("//") + 2);
if (! givenURL.startsWith("file:")) {
int exist = exists(givenURL);
for(int pow = 3; pow >= 0; pow--)
{
int getError = (int)Math.pow(2, pow);
if(exist >= getError)
{
errorText += errorMap.get(getError);
if (getError == SITE_VALID) {
validURLS(count);
}
else if(getError == SITE_INVALID)
{
errorText+= count + " is not a valid URL.\n";
}
else if(getError == SITE_BAD_EXTENSION)
{
errorText+= count + " is not valid.\n";
}
else if(getError == SITE_EXCEPTION)
{
exception = true;
}
exist-= getError;
}
}
/*
* if(exist == SITE_VALID){
* System.out.println("it exists");
* validURLS(count); }
*
* else if(exist == SITE_INVALID){ errorText+=
* "The given URL caught for URL #" + count+
* " is not a valid URL."; } else
* if(exist==SITE_EXCEPTION) { errorText+=
* "There may be no internet connectivity at the moment."
* ; }
*/
}
}
else {
errorText += "The given URL for URL #"
+ count
+ " must start with either \"http://\", \"https://\", or \"file://\".\n";
}
count++;
}
if(exception){
errorText+= "There may be no internet connectivity at the moment.\n";
}
if (! errorText.equals("")) {
boolean tryAgain = messageBox(errorText, SWT.ICON_ERROR);
if (tryAgain) {
if (! isValidURL) {
urlText.forceFocus();
}
else if (! isValidURL2) {
urlText2.forceFocus();
}
else {
urlText3.forceFocus();
}
}
} else {
saveSettings();
userResponse = OK;
dialog.close();
}
}
});
cancelButton = new Button(comp, SWT.PUSH);
cancelButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent evt) {
userResponse = CANCEL;
dialog.close();
}
});
if (buttonFont != null) {
okButton.setFont(buttonFont);
cancelButton.setFont(buttonFont);
}
okButton.setText(L10N.get("B.OK", "OK"));
cancelButton.setText(L10N.get("B.CANCEL", "Cancel"));
dialog.setDefaultButton(okButton);
FormData formData = new FormData();
formData.left = new FormAttachment(0, 5);
formData.top = new FormAttachment(0, 5);
dialogTitle.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(dialogTitle, 20, SWT.BOTTOM);
formData.left = new FormAttachment(0, 100);
intoDesignLbl.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(intoDesignLbl, 0, SWT.CENTER);
formData.left = new FormAttachment(intoDesignLbl, 5, SWT.RIGHT);
designCombo.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(intoDesignLbl, 13, SWT.BOTTOM);
formData.left = new FormAttachment(0, 6);
formData.right = new FormAttachment(100, -6);
useSelectionGroup.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(0, 3);
formData.left = new FormAttachment(0, 3);
formData.right = new FormAttachment(100, -3);
typeHTMLGroup.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(typeHTMLGroup, 10, SWT.BOTTOM);
formData.left = new FormAttachment(typeHTMLGroup, 0, SWT.LEFT);
formData.right = new FormAttachment(typeHTMLGroup, 350, SWT.LEFT);
urlText.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(urlText, 1, SWT.TOP);
formData.left = new FormAttachment(urlText, 5, SWT.RIGHT);
plusButton.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(plusButton, 5, SWT.TOP);
formData.left = new FormAttachment(plusButton, 10, SWT.RIGHT);
minusButton.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(urlText, 5, SWT.BOTTOM);
formData.left = new FormAttachment(urlText, 10, SWT.LEFT);
maximumDepthToCrawlLabel.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(maximumDepthToCrawlLabel, 0, SWT.TOP);
formData.left = new FormAttachment(maximumDepthToCrawlLabel, 3,
SWT.RIGHT);
questionMarkButtonDepth.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(maximumDepthToCrawlLabel, 0, SWT.TOP);
formData.left = new FormAttachment(questionMarkButtonDepth, 10,
SWT.RIGHT);
maxDepthCombo.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(maximumDepthToCrawlLabel, 15,
SWT.BOTTOM);
formData.left = new FormAttachment(urlText, 10, SWT.LEFT);
restrictDomainLabel.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(restrictDomainLabel, 0, SWT.TOP);
formData.left = new FormAttachment(restrictDomainLabel, 3, SWT.RIGHT);
questionMarkButtonDomain.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(restrictDomainLabel, 10, SWT.BOTTOM);
formData.left = new FormAttachment(0, 25);
useHTML1.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(useHTML1, 0, SWT.TOP);
formData.left = new FormAttachment(useHTML1, 0, SWT.RIGHT);
urlPath1.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(useHTML1, 8, SWT.BOTTOM);
formData.left = new FormAttachment(useHTML1, 0, SWT.LEFT);
useHTML2.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(useHTML2, 0, SWT.TOP);
formData.left = new FormAttachment(useHTML2, 0, SWT.RIGHT);
urlPath2.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(useHTML2, 8, SWT.BOTTOM);
formData.left = new FormAttachment(useHTML2, 0, SWT.LEFT);
useHTML3.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(useHTML3, 0, SWT.TOP);
formData.left = new FormAttachment(useHTML3, 0, SWT.RIGHT);
urlPath3.setLayoutData(formData);
formData = new FormData();
formData.left = new FormAttachment(urlPath3, 0, SWT.RIGHT);
formData.top = new FormAttachment(urlPath3, 0, SWT.TOP);
urlPath3b.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(useSelectionGroup, 7, SWT.BOTTOM);
formData.left = new FormAttachment(maxPagesLabel, 0, SWT.LEFT);
capturePageImagesOption.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(capturePageImagesOption, 0, SWT.TOP);
formData.left = new FormAttachment(capturePageImagesOption,3,
SWT.RIGHT);
questionMarkButtonCaptureImage.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(capturePageImagesOption, 15,
SWT.BOTTOM);
formData.right = new FormAttachment(intoDesignLbl, 0, SWT.RIGHT);
maxPagesLabel.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(maxPagesLabel, 0, SWT.CENTER);
formData.left = new FormAttachment(maxPagesLabel, 5, SWT.RIGHT);
formData.right = new FormAttachment(maxPagesLabel, 140, SWT.RIGHT);
maxPagesToImport.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(maxPagesToImport, 0, SWT.TOP);
formData.left = new FormAttachment(maxPagesToImport, 3, SWT.RIGHT);
questionMarkButtonMaxPages.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(maxPagesLabel, 11, SWT.BOTTOM);
formData.right = new FormAttachment(maxPagesLabel, 0, SWT.RIGHT);
browserWidthLbl.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(browserWidthLbl, 0, SWT.CENTER);
formData.left = new FormAttachment(browserWidthLbl, 5, SWT.RIGHT);
formData.right = new FormAttachment(browserWidthLbl, 140, SWT.RIGHT);
browserWidthEntry.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(browserWidthLbl, 11, SWT.BOTTOM);
formData.right = new FormAttachment(browserWidthLbl, 0, SWT.RIGHT);
browserHeightLbl.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(browserHeightLbl, 0, SWT.CENTER);
formData.left = new FormAttachment(browserHeightLbl, 5, SWT.RIGHT);
formData.right = new FormAttachment(browserHeightLbl, 140, SWT.RIGHT);
browserHeightEntry.setLayoutData(formData);
Composite spacer = new Composite(comp, SWT.NONE);
formData = new FormData();
formData.top = new FormAttachment(browserHeightEntry, 13,
SWT.BOTTOM);
formData.bottom = new FormAttachment(okButton, 0, SWT.TOP);
spacer.setLayoutData(formData);
formData = new FormData();
formData.right = new FormAttachment(100, -13);
formData.bottom = new FormAttachment(100, -13);
formData.left = new FormAttachment(100, -95);
formData.top = new FormAttachment(browserHeightEntry, 10, SWT.BOTTOM);
Button other;
if (OSUtils.MACOSX) {
okButton.setLayoutData(formData);
other = okButton;
} else {
cancelButton.setLayoutData(formData);
other = cancelButton;
}
formData = new FormData();
formData.right = new FormAttachment(other, -13, SWT.LEFT);
formData.bottom = new FormAttachment(100, -13);
formData.left = new FormAttachment(other, -95, SWT.LEFT);
formData.top = new FormAttachment(browserHeightEntry, 10, SWT.BOTTOM);
if (OSUtils.MACOSX) {
cancelButton.setLayoutData(formData);
} else {
okButton.setLayoutData(formData);
}
sc1.setContent(comp);
sc1.layout();
// dialog.pack();
repaint();
}
public void buildSecondGroup() {
typeHTMLGroup2 = new Group(useSelectionGroup, SWT.SHADOW_NONE);
typeHTMLGroup2.setText("Starting URL #2");
typeHTMLGroup2.setLayout(new FormLayout());
urlText2 = new TextWithEnableFix(typeHTMLGroup2, SWT.BORDER
| SWT.SINGLE);
urlText2.setText("http://");
urlText2.setVisible(false);
urlText2.addTraverseListener(new TraverseListener() {
public void keyTraversed(TraverseEvent e) {
if (e.detail == SWT.TRAVERSE_TAB_PREVIOUS) {
e.detail = SWT.TRAVERSE_NONE;
questionMarkButtonDomain.forceFocus();
}
}
});
urlPath4 = new Label(typeHTMLGroup2, SWT.NONE);
urlPath5 = new Label(typeHTMLGroup2, SWT.NONE);
urlPath6 = new Label(typeHTMLGroup2, SWT.NONE);
urlPath6b = new Label(typeHTMLGroup2, SWT.NONE);
urlPath6b.setText("path");
urlPath6b.setFont(URL_PATH_FONT);
urlPath6b.setVisible(false);
useHTML4 = new Button(typeHTMLGroup2, SWT.RADIO);
useHTML4.addSelectionListener(domainListener);
useHTML4.setSelection(true);
useHTML5 = new Button(typeHTMLGroup2, SWT.RADIO);
useHTML5.addSelectionListener(domainListener);
useHTML6 = new Button(typeHTMLGroup2, SWT.RADIO);
useHTML6.addSelectionListener(domainListener);
plusButton2 = makeToolBarButton(typeHTMLGroup2, addGroupListener, questionImages.PLUS_IMAGE);
minusButton2 = makeToolBarButton(typeHTMLGroup2, minusGroupListener2, questionImages.MINUS_IMAGE);
questionMarkButtonDepth2 = makeToolBarButton(typeHTMLGroup2, depthListener, questionImages.QUESTION_SHADOW);
maximumDepthToCrawlLabel2 = new Label(typeHTMLGroup2, SWT.NONE);
maximumDepthToCrawlLabel2.setText("Maximum Depth To Crawl: ");
maxDepthCombo2 = new ComboWithEnableFix(typeHTMLGroup2,
SWT.DROP_DOWN | SWT.READ_ONLY);
maxDepthCombo2.add("Unlimited");
for (int i = 0; i < 100; i++) {
maxDepthCombo2.add("" + i);
}
maxDepthCombo2.select(2);
maxDepthCombo2.setVisibleItemCount(21);
maxDepthCombo2.addSelectionListener(comboListener);
restrictDomainLabel2 = new Label(typeHTMLGroup2, SWT.NONE);
restrictDomainLabel2.setText("Restrict Domain: ");
questionMarkButtonDomain2 = makeToolBarButton(typeHTMLGroup2, domainHelpListener, questionImages.QUESTION_SHADOW);
questionMarkButtonDomain2.setVisible(false);
questionMarkButtonDomain2
.addTraverseListener(new TraverseListener() {
public void keyTraversed(TraverseEvent e) {
if (e.detail == SWT.TRAVERSE_TAB_NEXT) {
if (numOfGroups > 2) {
e.detail = SWT.TRAVERSE_NONE;
urlText3.forceFocus();
}
}
}
});
urlText2.addFocusListener(new TextFocusListener(urlText2,
urlPath5, urlPath6, useHTML4,useHTML5, useHTML6, 2));
}
public void buildThirdGroup() {
typeHTMLGroup3 = new Group(useSelectionGroup, SWT.SHADOW_NONE);
typeHTMLGroup3.setText("Starting URL #3");
typeHTMLGroup3.setLayout(new FormLayout());
urlText3 = new TextWithEnableFix(typeHTMLGroup3, SWT.BORDER
| SWT.SINGLE);
urlText3.setText("http://");
urlText3.addTraverseListener(new TraverseListener() {
public void keyTraversed(TraverseEvent e) {
if (e.detail == SWT.TRAVERSE_TAB_PREVIOUS) {
e.detail = SWT.TRAVERSE_NONE;
questionMarkButtonDomain2.forceFocus();
}
}
});
plusButton3 = makeToolBarButton(typeHTMLGroup3, addGroupListener, questionImages.PLUS_IMAGE);
minusButton3 = makeToolBarButton(typeHTMLGroup3, minusGroupListener3, questionImages.MINUS_IMAGE);
maximumDepthToCrawlLabel3 = new Label(typeHTMLGroup3, SWT.NONE);
maximumDepthToCrawlLabel3.setText("Maximum Depth To Crawl: ");
questionMarkButtonDepth3 = makeToolBarButton(typeHTMLGroup3, depthListener, questionImages.QUESTION_SHADOW);
maxDepthCombo3 = new ComboWithEnableFix(typeHTMLGroup3,
SWT.DROP_DOWN | SWT.READ_ONLY);
maxDepthCombo3.add("Unlimited");
for (int i = 0; i < 100; i++) {
maxDepthCombo3.add("" + i);
}
maxDepthCombo3.select(2);
maxDepthCombo3.setVisibleItemCount(21);
useHTML7 = new Button(typeHTMLGroup3, SWT.RADIO);
useHTML7.addSelectionListener(domainListener);
useHTML7.setSelection(true);
useHTML8 = new Button(typeHTMLGroup3, SWT.RADIO);
useHTML8.addSelectionListener(domainListener);
useHTML9 = new Button(typeHTMLGroup3, SWT.RADIO);
useHTML9.addSelectionListener(domainListener);
urlPath7 = new Label(typeHTMLGroup3, SWT.NONE);
urlPath7.setText("Unrestricted");
urlPath8 = new Label(typeHTMLGroup3, SWT.NONE);
urlPath8.setText("http://host_name/");
urlPath9 = new Label(typeHTMLGroup3, SWT.NONE);
urlPath9.setText("http://host_name/path");
urlPath9b = new Label(typeHTMLGroup3, SWT.NONE);
urlPath9b.setText("path");
urlPath9b.setFont(URL_PATH_FONT);
urlPath9b.setVisible(false);
maxDepthCombo3.addSelectionListener(comboListener);
restrictDomainLabel3 = new Label(typeHTMLGroup3, SWT.NONE);
restrictDomainLabel3.setText("Restrict Domain: ");
questionMarkButtonDomain3 = makeToolBarButton(typeHTMLGroup3, domainHelpListener, questionImages.QUESTION_SHADOW);
urlText3.addFocusListener(new TextFocusListener(urlText3,
urlPath8, urlPath9, useHTML7, useHTML8, useHTML9, 3));
}
public void moveGroupTwoToOne() {
urlText.setText(urlText2.getText());
maxDepthCombo.select(maxDepthCombo2.getSelectionIndex());
useHTML1.setSelection(useHTML4.getSelection());
useHTML2.setSelection(useHTML5.getSelection());
useHTML3.setSelection(useHTML6.getSelection());
urlPath1.setText(urlPath4.getText());
urlPath2.setText(urlPath5.getText());
urlPath2.setFont(urlPath5.getFont());
urlPath3.setText(urlPath6.getText());
urlPath3.setFont(urlPath6.getFont());
isValidURL = isValidURL2;
if (! isValidURL) {
urlText.forceFocus();
}
urlPath3b.setVisible(urlPath6b.isVisible());
}
public void moveGroupThreeToTwo() {
maxDepthCombo2.select(maxDepthCombo3.getSelectionIndex());
urlText2.setText(urlText3.getText());
useHTML4.setSelection(useHTML7.getSelection());
useHTML5.setSelection(useHTML8.getSelection());
useHTML6.setSelection(useHTML9.getSelection());
urlPath4.setText(urlPath7.getText());
urlPath5.setText(urlPath8.getText());
urlPath5.setFont(urlPath8.getFont());
urlPath6.setText(urlPath9.getText());
urlPath6.setFont(urlPath9.getFont());
isValidURL2 = isValidURL3;
if (! isValidURL2) {
if (isValidURL) {
urlText2.forceFocus();
}
}
urlPath6b.setVisible(urlPath9b.isVisible());
displayThirdGroup(false);
}
public String secondDomain(String string, Button button, Label path) {
int index = 0;
int substringIndex=0;
button.setEnabled(true);
if (checkProtocol(string, false)) {
button.setEnabled(false);
path.setFont(URL_PATH_FONT);
return "http://www.host_name/";
}
if (checkProtocol(string, true)) {
substringIndex = string.indexOf("//") + 2;
//while loop simulates a regex to parse through multiple slashes like http://, file:///, and file:////
while((substringIndex< string.length()) && (string.charAt(substringIndex) == '/')){
substringIndex++;
}
index += string.substring(substringIndex).indexOf("/");
}
else {
index = string.indexOf("/");
}
if ((index != -1) && (index < string.length())) {
index+= substringIndex;
path.setFont(null);
return string.substring(0, index + 1);
}
path.setFont(null);
return string + "/";
}
public String thirdDomain(String string, String secondDomain,
Button button, int group) {
int index = string.lastIndexOf("/");
String st = string;
st = string.substring(0, index + 1);
if ((((st.equals("")) || (st.equals("http://"))))
&& (!((string + "/").equals(secondDomain)))) {
clearExtraLabel(group, URL_PATH_FONT);
button.setEnabled(false);
return "http://www.host_name/path";
} else if ((st.equals(secondDomain) || ((string + "/")
.equals(secondDomain)))) {
button.setEnabled(false);
Label path = null;
Label pathb = null;
if (group == 1) {
path = urlPath3;
pathb = urlPath3b;
}
else if (group == 2) {
path = urlPath6;
pathb = urlPath6b;
}
else {
path = urlPath9;
pathb = urlPath9b;
}
path.setFont(null);
pathb.setVisible(true);
return secondDomain;
}
button.setEnabled(true);
clearExtraLabel(group, null);
return st;
}
public void clearExtraLabel(int group, Font font) {
Label pathLabel = null;
if (group == 1) {
pathLabel = urlPath3b;
urlPath3.setFont(font);
}
else if (group == 2) {
pathLabel = urlPath6b;
urlPath6.setFont(font);
}
else {
pathLabel = urlPath9b;
urlPath9.setFont(font);
}
pathLabel.setVisible(false);
repaint();
}
public boolean checkProtocol(String string, boolean start) {
boolean bool = false;
int i = 0;
if (start) {
while ((i < allowedProtocols.length) && (! bool)) {
bool = string.regionMatches(true, 0, allowedProtocols[i], 0,
allowedProtocols[i].length());
i++;
}
}
else {
while ((! bool) && (i < allowedProtocols.length)) {
bool = string.equals(allowedProtocols[i]);
i++;
}
}
return bool;
}
public int exists(String URLName) {
try {
HttpURLConnection con = (HttpURLConnection) new URL(URLName)
.openConnection();
con.setRequestMethod("HEAD");
if (con.getResponseCode() == HttpURLConnection.HTTP_OK
|| (con.getResponseCode() == HttpURLConnection.HTTP_ACCEPTED)) {
if(! isAllowedExtension(URLName))
{
return SITE_BAD_EXTENSION;
}
return SITE_VALID;
}
return SITE_INVALID;
}
catch (UnknownHostException e) {
try {
HttpURLConnection con2 = (HttpURLConnection) new URL(
"http://www.google.com").openConnection();
con2.setRequestMethod("HEAD");
int response= con2.getResponseCode(); //this line will throw an unknown host exception if there is no internet connectivity
}
catch (UnknownHostException ex)
{
return SITE_EXCEPTION;
}
catch (Exception ex)
{
if(! isAllowedExtension(URLName))
{
return SITE_BAD_EXTENSION | SITE_EXCEPTION;
}
return SITE_EXCEPTION;
}
if(! isAllowedExtension(URLName))
{
return SITE_BAD_EXTENSION | SITE_INVALID;
}
return SITE_INVALID;
} catch (IOException e) {
// e.printStackTrace();
// check to see what kind of exceptions can be thrown
if(! isAllowedExtension(URLName)){
return SITE_BAD_EXTENSION | SITE_INVALID;
}
return SITE_INVALID;
} catch (Exception e) {
try {
HttpURLConnection con2 = (HttpURLConnection) new URL(
"http://www.google.com").openConnection();
con2.setRequestMethod("HEAD");
int response= con2.getResponseCode();
} catch (UnknownHostException ex) {
if(! isAllowedExtension(URLName))
{
return SITE_BAD_EXTENSION | SITE_INVALID | SITE_EXCEPTION;
}
return SITE_EXCEPTION | SITE_INVALID;
}
catch (Exception ex) {
return SITE_EXCEPTION;
}
return SITE_INVALID;
}
// finally close the HTTPURLConnection to prevent resource link
}
public boolean messageBox(String message, int style) {
if (style == SWT.ICON_ERROR) {
message += "Do you want to try again?";
style = style | SWT.YES | SWT.NO;
}
messageBox = new MessageBox(dialog, style);
messageBox.setMessage(message);
if (messageBox.open() == SWT.NO) {
userResponse = CANCEL;
dialog.close();
return false;
}
return true;
}
public void buildSameURLGroup() {
sameURLGroup = new Group(comp, SWT.SHADOW_NONE);
sameURLGroup.setText(SAME_URL_GROUP);
sameURLGroup.setLayout(new FormLayout());
pruneCrawlOnSame = new Button(sameURLGroup, SWT.RADIO);
pruneCrawlOnSame.setText(SAME_URL_PRUNE_LABEL);
pruneCrawlOnSame.setSelection(true);
pruneCrawlOnSame.setEnabled(false);
replacePageOnSame = new Button(sameURLGroup, SWT.RADIO);
replacePageOnSame.setText(SAME_URL_REPLACE_LABEL);
replacePageOnSame.setEnabled(false);
}
public void displaySameURLGroup(boolean showGroup) {
FormData formData;
if (showGroup) {
formData = new FormData();
formData.top = new FormAttachment(designCombo, 7, SWT.BOTTOM);
formData.left = new FormAttachment(0, 6);
formData.right = new FormAttachment(100, -6);
sameURLGroup.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(sameURLGroup, 7, SWT.BOTTOM);
formData.left = new FormAttachment(0, 6);
formData.right = new FormAttachment(100, -6);
useSelectionGroup.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(0, 7);
formData.left = new FormAttachment(0, 13);
pruneCrawlOnSame.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(pruneCrawlOnSame, 5,
SWT.BOTTOM);
formData.left = new FormAttachment(pruneCrawlOnSame, 0,
SWT.LEFT);
replacePageOnSame.setLayoutData(formData);
repaint();
}
else {
// move useSelectionGroup below the designCombo
formData = new FormData();
sameURLGroup.setLayoutData(formData);
formData = new FormData();
pruneCrawlOnSame.setLayoutData(formData);
formData = new FormData();
replacePageOnSame.setLayoutData(formData);
formData = new FormData();
formData.top = new FormAttachment(designCombo, 7, SWT.BOTTOM);
formData.left = new FormAttachment(0, 6);
formData.right = new FormAttachment(100, -6);
useSelectionGroup.setLayoutData(formData);
}
sameURLGroup.setVisible(showGroup);
replacePageOnSame.setVisible(showGroup);
pruneCrawlOnSame.setVisible(showGroup);
pruneCrawlOnSame.setEnabled(showGroup);
replacePageOnSame.setEnabled(showGroup);
}
public void validURLS(int count) {
switch (count) {
case 1:
isValidURL = true;
break;
case 2:
isValidURL2 = true;
break;
case 3:
isValidURL3 = true;
break;
}
}
public void minusGroupTwo() {
if (numOfGroups == 2) { // move second group to first
displaySecondGroup(false);
} else { // move third to second and move second to first
moveGroupThreeToTwo();
displayThirdGroup(false);
}
numOfGroups--;
repaint();
}
protected static final String[] allowedExtensions =
new String[] { ".htm", ".html", ".xhtml", ".shtml",
".php", ".jsp", ".asp", ".aspx",
".cfm", ".pl", ".py", ".rb" };
protected boolean isAllowedExtension(String url)
{
String extension = "";
try {
String path = new URL(url).getPath();
int extPos = path.lastIndexOf('.');
if (extPos != -1) {
extension = path.substring(extPos);
}
// otherwise, no extension!
}
catch (MalformedURLException e) {
// Hmm; postpone dealing with this for now
// TODO: Possibly, return false to eliminate from consideration?
return true;
}
if (extension.length() == 0) {
return true;
}
for (String allowedExtension : allowedExtensions) {
if (allowedExtension.equalsIgnoreCase(extension)) {
return true;
}
}
return false;
}
public void repaint()
{
Point point = dialog.getSize();
comp.setSize(comp.computeSize(SWT.DEFAULT, SWT.DEFAULT, true));
dialog.setSize(point);
dialog.layout(true, true);
comp.layout();
}
}