public Explorer() {
    
    String date = (new SimpleDateFormat("EEEE, d MMMM yyyy")).format(new Date());
    m_LogPanel.logMessage("Weka Explorer");
    m_LogPanel.logMessage("(c) " + Copyright.getFromYear() + "-" + Copyright.getToYear() 
	+ " " + Copyright.getOwner() + ", " + Copyright.getAddress());
    m_LogPanel.logMessage("web: " + Copyright.getURL());
    m_LogPanel.logMessage("Started on " + date);
    m_LogPanel.statusMessage("Welcome to the Weka Explorer");

    // intialize pre-processpanel
    m_PreprocessPanel.setLog(m_LogPanel);
    m_TabbedPane.addTab(
	m_PreprocessPanel.getTabTitle(),
	null,
	m_PreprocessPanel,
	m_PreprocessPanel.getTabTitleToolTip());
    
    // initialize additional panels
    String[] tabs = ExplorerDefaults.getTabs();
    Hashtable<String, HashSet> tabOptions = new Hashtable<String, HashSet>();
    for (int i = 0; i < tabs.length; i++) {
      try {
	// determine classname and additional options
	String[] optionsStr = tabs[i].split(":");
	String classname = optionsStr[0];
	HashSet options = new HashSet();
	tabOptions.put(classname, options);
	for (int n = 1; n < optionsStr.length; n++)
	  options.add(optionsStr[n]);
	  
	// setup panel
	ExplorerPanel panel = (ExplorerPanel) Class.forName(classname).newInstance();
	panel.setExplorer(this);
	m_Panels.add(panel);
	if (panel instanceof LogHandler)
	  ((LogHandler) panel).setLog(m_LogPanel);
	m_TabbedPane.addTab(
	    panel.getTabTitle(), null, (JPanel) panel, panel.getTabTitleToolTip());
      }
      catch (Exception e) {
	e.printStackTrace();
      }
    }

    // setup tabbed pane
    m_TabbedPane.setSelectedIndex(0);
    for (int i = 0; i < m_Panels.size(); i++) {
      HashSet options = tabOptions.get(m_Panels.get(i).getClass().getName());
      m_TabbedPane.setEnabledAt(i + 1, options.contains("standalone"));
    }

    // setup notification for dataset changes
    m_PreprocessPanel.addPropertyChangeListener(new PropertyChangeListener() {
      public void propertyChange(PropertyChangeEvent e) {
	for (int i = 0; i < m_Panels.size(); i++) {
	   m_Panels.get(i).setInstances(m_PreprocessPanel.getInstances());
	   m_TabbedPane.setEnabledAt(i + 1, true);
	}
      }
    });

    // add listeners for changes in the capabilities
    m_PreprocessPanel.setExplorer(this);
    addCapabilitiesFilterListener(m_PreprocessPanel);
    for (int i = 0; i < m_Panels.size(); i++) {
      if (m_Panels.get(i) instanceof CapabilitiesFilterChangeListener)
	addCapabilitiesFilterListener((CapabilitiesFilterChangeListener) m_Panels.get(i));
    }

    // add components to layout
    setLayout(new BorderLayout());
    add(m_TabbedPane, BorderLayout.CENTER);
    add(m_LogPanel, BorderLayout.SOUTH);
  }