public AbstractMainframe(Controlador controlador) {
		super(controlador);
		panel.setLayout(new FlowLayout(FlowLayout.LEADING));
		desconectar.setEnabled(false);
		frame.setResizable(false);
		
		/* False para iconified, True para o resto */
		frame.addWindowStateListener(e -> frame.setVisible(e.getNewState() != JFrame.ICONIFIED));
				
		icone.addActionListener(e -> exibir.doClick());
		
		exibir.addActionListener(e -> {
			frame.setVisible(true);
			frame.setExtendedState(JFrame.NORMAL);
		});
		
		icone.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseReleased(MouseEvent e) {
				if (e.isPopupTrigger()) {
					popup.setLocation(e.getPoint());
					popup.setInvoker(popup);
					popup.setVisible(true);
				}
			}
		});
		
		sair.addActionListener(e -> {
			destroy();
			terminate();
		});
		
		desconectar.addActionListener(e -> {
			SwingUtilities.invokeLater(() -> {
				SocketInformation info = lista.getSelectedValue();
				if (info == null) return;
				if (desconectar.getText().equals(AbstractMainframe.REMOVE)) {
					controlador.removerSocket(info);
					try {
						modelo.removeElement(info);
					} catch (NullPointerException e1) {
						/* Erro no Swing? Não fazer nada */
					}
					desconectar.setEnabled(false);
				} else {
					controlador.fecharSocket(info);
				}
			});
		});
		
		lista.addListSelectionListener(e -> {
			if (!e.getValueIsAdjusting()) {
				SocketInformation info = lista.getSelectedValue();
				boolean fechado = info == null ? true : info.isClosed();
				changeActions(fechado);
			}
		});
		
		try {
			tray.add(icone);
			popup.add(exibir);
			popup.addSeparator();
			popup.add(sair);
		} catch (AWTException e1) {
			e1.printStackTrace();
		}
	}